열에서 공통 값을 기준으로 큰 데이터 프레임을 데이터 프레임 목록으로 나눕니다.
저는 열이 10개인 데이터 프레임을 가지고 있는데, 열 중 하나에 ID(유일하지 않은 사용자 식별)가 포함되어 있습니다(열 10).데이터 프레임의 길이는 약 7500,000 행입니다.저는 단일 행위자의 동작을 분리하기 위해 개별 데이터 프레임(따라서 데이터 프레임의 목록 또는 벡터를 얻는 것)을 "사용자" 식별자가 포함된 열로 분할하여 추출하려고 합니다.
ID | Data1 | Data2 | ... | UserID
1 | aaa | bbb | ... | u_001
2 | aab | bb2 | ... | u_001
3 | aac | bb3 | ... | u_001
4 | aad | bb4 | ... | u_002
결과적으로
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
...)
다음은 작은 샘플(1000행)에 매우 적합합니다.
paths = by(smallsampleMat, smallsampleMat[,"userID"], function(x) x)
예를 들어 경로[1]를 통해 원하는 요소에 액세스합니다.
원래의 대용량 데이터 프레임이나 심지어 행렬 표현에 적용할 때, 이것은 내 컴퓨터(4GB RAM, MacOSX 10.6, R 2.15)를 초킹시키고 결코 완료되지 않습니다(새로운 R 버전이 존재한다는 것은 알지만, 이것이 주요 문제가 아니라고 생각합니다).
분할이 더 성능적이고 오랜 시간이 지나면 완료되는 것처럼 보이지만 결과 벡터 목록을 행렬 벡터로 분할하는 방법을 모르겠습니다(열등한 R 지식).
path = split(smallsampleMat, smallsampleMat[,10])
사용하는 것도 고려했습니다.big.matrix
그 외, 하지만 큰 성공 없이는 그 과정이 더 빨라질 것입니다.
예를 들어 목록의 각 요소에 쉽게 액세스할 수 있습니다.path[[1]]
. 행렬의 집합을 원자 벡터에 넣고 각 원소에 접근할 수 없습니다.행렬은 차원 속성을 가진 원자 벡터입니다.저는 반환된 목록 구조를 사용할 것입니다.split
, 그것이 의도한 것입니다.각 리스트 요소는 다양한 종류와 크기의 데이터를 담을 수 있어 다용도로 사용할 수 있습니다.*apply
목록의 각 요소에 대해 추가로 작동하는 함수입니다.아래 예시.
# For reproducibile data
set.seed(1)
# Make some data
userid <- rep(1:2,times=4)
data1 <- replicate(8 , paste( sample(letters , 3 ) , collapse = "" ) )
data2 <- sample(10,8)
df <- data.frame( userid , data1 , data2 )
# Split on userid
out <- split( df , f = df$userid )
#$`1`
# userid data1 data2
#1 1 gjn 3
#3 1 yqp 1
#5 1 rjs 6
#7 1 jtw 5
#$`2`
# userid data1 data2
#2 2 xfv 4
#4 2 bfe 10
#6 2 mrx 2
#8 2 fqd 9
각 요소에 액세스하려면[[
연산자는 다음과 같습니다.
out[[1]]
# userid data1 data2
#1 1 gjn 3
#3 1 yqp 1
#5 1 rjs 6
#7 1 jtw 5
또는 사용.*apply
각 목록 요소에 대한 추가 작업을 수행하는 기능입니다.예를 들어, 평균을 생각해보면,data2
칼럼은 다음과 같이 saply를 사용할 수 있습니다.
sapply( out , function(x) mean( x$data2 ) )
# 1 2
#3.75 6.25
버전 0.8.0부터.dplyr
라는 편리한 기능을 제공합니다.group_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
그룹화 열을 포함하지 않는 방법
df %>%
group_split(g, keep = FALSE)
우연히 이 답변을 접했고 실제로 두 그룹(한 사용자가 포함된 데이터와 그 한 사용자를 제외한 모든 것이 포함된 데이터)을 원했습니다.이 게시물의 세부 사항에는 필요하지 않지만, 누군가가 나와 같은 문제를 구글링하고 있을 경우를 대비하여 추가하려고 생각했습니다.
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']]
다음과 같습니다.
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
언급URL : https://stackoverflow.com/questions/18527051/split-a-large-dataframe-into-a-list-of-data-frames-based-on-common-value-in-colu
'programing' 카테고리의 다른 글
Woocmerce에서 특정 상품 속성이 있는지 확인하는 방법 (0) | 2023.10.01 |
---|---|
단순입력함 기능 (0) | 2023.10.01 |
jQuery에서 여러 ID 처리 (0) | 2023.10.01 |
자바스크립트에서 객체 배열에서 값을 찾는 방법은? (0) | 2023.09.26 |
Sping-Boot 구성:맵 채우기에 사용되는 yaml 키의 공백을 유지하는 방법 (0) | 2023.09.26 |