2017-12-10 1 views
1

임의의 데이터를 생성 중입니다. idval 변수를 포함해야하며 값은 단일 ID 내에서 겹칠 수는 없지만 id-s에서 중복 될 수 있습니다. 다른 ID의 값은 다른 숫자 n입니다. I 수동으로 원하는 결과를 만들 수 :그룹별로 데이터 프레임에 가변 길이 값을 추가하는 편리한 방법

n <- c(3,2,4) 
data.frame(id=rep(letters[1:3], n), 
      val=c(sample(10, n[1]), 
       sample(10, n[2]), 
       sample(10, n[3]))) 
    id val 
1 a 5 
2 a 10 
3 a 4 
4 b 9 
5 b 10 
6 c 10 
7 c 5 
8 c 2 
9 c 9 

I는 그룹 위에 루핑 및 rbind를 사용하거나 횟수에 대응하여 ID-S를 -ing rep를 사용하여 관련된 다른 솔루션을 상상할 수있다. 그러나 그러한 모든 접근법은 더러워지며 많은 변수와 큰 데이터로 확장되지 않을 수 있습니다.

더 깨끗한 방법이 있습니까? (dplyrish에서)처럼 뭔가 :

data.frame(id=letters[1:3]) %>% 
    mutate(i = row_number()) %>% 
    group_by(id) %>% 
    summarize_into_df(id=id, val=sample(10, n[i])) 

답변

0

당신은 lapplyn을 반복, 그것은 unnest 다음, sample를 사용하여 목록 열을 만들 수 있습니다

library(dplyr) 
library(tidyr) 

n <- c(3,2,4) 
data.frame(id = letters[1:length(n)]) %>% 
    mutate(val = lapply(n, sample, x=10)) %>% 
    unnest 

# id val 
#1 a 9 
#2 a 4 
#3 a 10 
#4 b 4 
#5 b 8 
#6 c 5 
#7 c 10 
#8 c 8 
#9 c 2 

또는 아주 가까운 어떤 패키지를 사용하지 않고 당신이 가지고있는 것, 그냥 unlist(lapply(...))으로 수동 구성을 대체하십시오 :

data.frame(id = rep(letters[1:length(n)], n), 
      val = unlist(lapply(n, sample, x=10))) 
+0

잘 작동하지 않습니다, 나는 그 사실을 알지 못했습니다! 여러 개의 id 변수가있는 경우 다른 솔루션은 약간 더러워집니다. –

관련 문제