如何将带有逗号分隔记录的矢量重新整形为纵向数据帧?

时间:2017-05-04 12:07:26

标签: r

这是我的数据框:

data_frame(id= c(1,2,3), 
           x=c('19,22,77', '49,67', '28,19,45,23'),
           y=c('19,22,77', '49,67', '28,19,45,23'),
           t=c('10,20,30', '49,67', '28,19,45,23'))

逗号分隔值是同一id随时间的不同观察结果,因此我希望以逗号形式对其进行重新分析,并以纵向格式重新整形,但保留与id的关联

例如,id=1的输出应该只有:

# A tibble: 3 × 4
     id     x     y     t
  <dbl> <dbl> <dbl> <dbl>
1     1    19    19    10
2     1    22    22    20
3     1    77    77    30

3 个答案:

答案 0 :(得分:2)

这是data.table的一种方法。

library(data.table)

setDT(df)[, lapply(.SD, tstrsplit, split=","), by=id]
   id  x  y  t
1:  1 19 19 10
2:  1 22 22 20
3:  1 77 77 30
4:  2 49 49 49
5:  2 67 67 67
6:  3 28 28 28
7:  3 19 19 19
8:  3 45 45 45
9:  3 23 23 23

对于每个id,我们lapply通过变量并应用trsplit(转置字符串拆分),在逗号上拆分。

数据

df <- data.frame(id= c(1,2,3), 
                 x=c('19,22,77', '49,67', '28,19,45,23'),
                 y=c('19,22,77', '49,67', '28,19,45,23'),
                 t=c('10,20,30', '49,67', '28,19,45,23'))

答案 1 :(得分:2)

此外,您可以使用tidyr

library(tidyr)
separate_rows(df,x,y,t, sep = ",")

答案 2 :(得分:1)

使用hadleyverse的替代解决方案

library(magrittr)

dplyr::data_frame(id= c(1,2,3), 
                  x=c('19,22,77', '49,67', '28,19,45,23'),
                  y=c('19,22,77', '49,67', '28,19,45,23'),
                  t=c('10,20,30', '49,67', '28,19,45,23')) %>% 
dplyr::mutate_if(is.character, stringr::str_split, pattern=',') %>% 
tidyr::unnest()


# A tibble: 9 × 4
     id     x     y     t
  <dbl> <chr> <chr> <chr>
1     1    19    19    10
2     1    22    22    20
3     1    77    77    30
4     2    49    49    49
5     2    67    67    67
6     3    28    28    28
7     3    19    19    19
8     3    45    45    45
9     3    23    23    23