Saya memiliki bingkai data dengan 10 kolom, mengumpulkan tindakan "pengguna", di mana salah satu kolom berisi ID (tidak unik, mengidentifikasi pengguna) (kolom 10). panjang bingkai data sekitar 750000 baris. Saya mencoba untuk mengekstrak frame data individu (sehingga mendapatkan daftar atau vektor frame data) yang dipisahkan oleh kolom yang berisi pengenal "pengguna", untuk mengisolasi tindakan aktor tunggal.
ID | Data1 | Data2 | ... | UserID
1 | aaa | bbb | ... | u_001
2 | aab | bb2 | ... | u_001
3 | aac | bb3 | ... | u_001
4 | aad | bb4 | ... | u_002
menghasilkan
list(
ID | Data1 | Data2 | ... | UserID
1 | aaa | bbb | ... | u_001
2 | aab | bb2 | ... | u_001
3 | aac | bb3 | ... | u_001
,
4 | aad | bb4 | ... | u_002
...)
Berikut ini bekerja sangat baik untuk saya pada sampel kecil (1000 baris):
paths = by(smallsampleMat, smallsampleMat[,"userID"], function(x) x)
dan kemudian mengakses elemen yang saya inginkan dengan jalur [1] misalnya.
Saat menerapkan pada bingkai data besar asli atau bahkan representasi matriks, ini mencekik mesin saya (RAM 4GB, MacOSX 10.6, R 2.15) dan tidak pernah selesai (saya tahu bahwa ada versi R yang lebih baru, tetapi saya yakin ini bukan masalah utama ).
Tampaknya pemisahan lebih berkinerja dan setelah waktu yang lama selesai, tetapi saya tidak tahu (pengetahuan R inferior) bagaimana cara memotong daftar vektor yang dihasilkan menjadi vektor matriks.
path = split(smallsampleMat, smallsampleMat[,10])
Saya telah mempertimbangkan juga menggunakan big.matrix
dll, tetapi tanpa banyak keberhasilan yang akan mempercepat prosesnya.
dlply(df, .(userid))
dan menemukan bahwa itu buruk dibandingkansplit
bahkan tanpa melibatkan jangka wakturequire(plyr)
, terima kasih dan OP!Dari versi 0.8.0,
dplyr
menawarkan fungsi praktis yang disebutgroup_split()
:# On sample data from @Aus_10 df %>% group_split(g) [[1]] # A tibble: 25 x 3 ran_data1 ran_data2 g <dbl> <dbl> <fct> 1 2.04 0.627 A 2 0.530 -0.703 A 3 -0.475 0.541 A 4 1.20 -0.565 A 5 -0.380 -0.126 A 6 1.25 -1.69 A 7 -0.153 -1.02 A 8 1.52 -0.520 A 9 0.905 -0.976 A 10 0.517 -0.535 A # … with 15 more rows [[2]] # A tibble: 25 x 3 ran_data1 ran_data2 g <dbl> <dbl> <fct> 1 1.61 0.858 B 2 1.05 -1.25 B 3 -0.440 -0.506 B 4 -1.17 1.81 B 5 1.47 -1.60 B 6 -0.682 -0.726 B 7 -2.21 0.282 B 8 -0.499 0.591 B 9 0.711 -1.21 B 10 0.705 0.960 B # … with 15 more rows
Untuk tidak menyertakan kolom pengelompokan:
df %>% group_split(g, keep = FALSE)
sumber
Tersandung pada jawaban ini dan saya benar-benar menginginkan KEDUA grup (data yang berisi satu pengguna dan data yang berisi segalanya kecuali satu pengguna itu). Tidak perlu untuk spesifik dari posting ini, tetapi saya pikir saya akan menambahkan jika seseorang mencari masalah yang sama dengan saya di Google.
df <- data.frame( ran_data1=rnorm(125), ran_data2=rnorm(125), g=rep(factor(LETTERS[1:5]), 25) ) test_x = split(df,df$g)[['A']] test_y = split(df,df$g!='A')[['TRUE']]
Berikut tampilannya:
head(test_x) x y g 1 1.1362198 1.2969541 A 6 0.5510307 -0.2512449 A 11 0.0321679 0.2358821 A 16 0.4734277 -1.2889081 A 21 -1.2686151 0.2524744 A > head(test_y) x y g 2 -2.23477293 1.1514810 B 3 -0.46958938 -1.7434205 C 4 0.07365603 0.1111419 D 5 -1.08758355 0.4727281 E 7 0.28448637 -1.5124336 B 8 1.24117504 0.4928257 C
sumber