2017-04-15 3 views
0

하나의 열이 목록 인 데이터 프레임에 데이터가 있습니다.R - 정리 목록의 Data_frame 열을 깔끔하게 정리하십시오.

rand_lets <- function(){ 
    sample(letters[1:26], runif(sample(1:10, 1), min=5, max=12)) 
} 

example_data <- data.frame(ID = seq(1:5), 
          location = LETTERS[1:5], 
          observations = I(list(rand_lets(), 
               rand_lets(), 
               rand_lets(), 
               rand_lets(), 
               rand_lets()))) 

나는이 목록의 각 요소가 새 열로 분리되도록 목록 열을 목록에서 제외 할 수있는 우아한 tidyverse 방법을 찾고 있어요 :이 예입니다. 예를 들어 첫 번째 행은 다음과 같이 보일 것이다 :

ID location observations observations.1 observations.3 observations.3 observations.4 observations.5 observations.6 observations.7 observations.8 observations.9 
1  A "y"   "b"    "m"    "u"    "x"    "j"    "t"    "i"    "v"    "w" 

물론 목록 항목이있을 수 있습니다 다른 길이 때문에 빈 셀은 NA해야한다.

어떻게이 작업을 수행 할 수 있습니까? 당신이 "긴"형식으로 데이터를 보존하려면

+0

긴 형식은 대개 확실히 불분명 한 데이터에 유용하지만, 실제로 와이드로 직접 가고 싶다면 목록 컬럼에서 데이터를 구조화 할 수 있습니다 : 'example_data %> % mutate (observations = map (observations, ~ as_data_frame (t (.x)))) %> % unnest()' – alistaire

+0

굉장합니다. 그것은'map()'의 깔끔한 사용법입니다. 긴 형식이 더 유용하다는 데 동의하지만 자습서에서 데이터 집합을 사용하고 넓은 형식에서 긴 형식으로 이동하는 것이 좋은 첫 번째 교훈입니다. –

답변

2

, 당신이 할 수 있습니다

example_data %>% unnest(observations) 
ID location observations 
1 1  A   e 
2 1  A   x 
3 1  A   w 
... 
44 5  E   u 
45 5  E   o 
46 5  E   z 

데이터를 확산하기를 "폭"형식, 당신의 예에서와 같이, 당신은 할 수 있습니다 :

library(stringr) 

example_data %>% unnest(observations) %>% 
    group_by(location) %>% 
    mutate(counter=paste0("Obs_", str_pad(1:n(),2,"left","0"))) %>% 
    spread(counter, observations) 
 ID location Obs_01 Obs_02 Obs_03 Obs_04 Obs_05 Obs_06 Obs_07 Obs_08 Obs_09 Obs_10 Obs_11 
* <int> <fctr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 
1  1  A  e  x  w  c  s  j  k  t  z <NA> <NA> 
2  2  B  k  u  d  h  z  x <NA> <NA> <NA> <NA> <NA> 
3  3  C  v  z  m  o  s  f  n  c  r  u  b 
4  4  D  z  i  m  s  a  v  n  r  e  t  x 
5  5  E  f  b  g  h  a  d  u  o  z <NA> <NA> 
+0

신난다 @ eipi10 - 왜'group_by (ID, location)'이 필요하지 않은지 설명해 주실 수 있습니까? ID별로 그룹이 어떻게 든 암시됩니다. BTW,'counter ='sprintf ("Obs_ % 02i", 1 : n())'은 표제를 형식화하는 더 좋은 방법 일 수 있습니다. – epi99

+1

위치 당 하나 이상의 ID가 있거나 그 반대의 경우,'group_by (ID, location)'를 사용하십시오. – eipi10