R-如何基于变量增量列表在数据帧中动态添加列

时间:2017-08-29 05:27:08

标签: r dataframe reshape

我需要完成以下任务;你可以帮我做一下。

我的数据框。

U_ID  Value                                          AD   CT
    1     list(`Cno`="50",`cna'="jhon")               ia   BG
    1     list(`Cno`="20",`cna'="guna")               AS   DB
    2     list(`Cno`="30",`cna'="rt",`cf'="ty")       BN   FV
    2     NULL                                        VF   TY
    3     list(`Cno`="30")                            RR   TT

我想要的输出是

U_ID  Value                                 Cno   cna   cf      AD   CT
1     list(`Cno`="50",`cna'="jhon")         50    jhon  NULL    ia   BG
1     list(`Cno`="20",`cna'="guna")         20   guna  NULL    AS   DB
2     list(`Cno`="30",`cna'="rt",`cf'="ty") 30   rt    ty      BN   FV
2     NULL                                 NULL  NULL  NULL    VF   TY
3     list(`Cno`="30")                     30    NULL  NULL     RR   TT

数据:

structure(list(U_ID = c(1, 1, 2, 2, 3), Value = list(structure(list(
    `Cno#` = "50", cna = "jhon"), .Names = c("Cno#", "cna")), 
    structure(list(`Cno#` = "50", cna = "guna"), .Names = c("Cno#", 
    "cna")), structure(list(`Cno#` = "30", cna = "rt", cf = "ty"), .Names = c("Cno#", 
    "cna", "cf")), "NULL", structure(list(`Cno#` = "30"), .Names = "Cno#")), 
    AD = c("ia", "AS", "BN", "VF", "RR"), CT = c("BG", "DB", 
    "FV", "TY", "TT")), .Names = c("U_ID", "Value", "AD", "CT"
), row.names = c(NA, -5L), class = "data.frame")

2 个答案:

答案 0 :(得分:0)

您应该使用:splitstackshape::cSplit功能。

答案 1 :(得分:0)

这是dplyr的解决方案。

library(dplyr)

dat %>%
  mutate(idx = as.character(`is.na<-`(cumsum(Value != "NULL"),
                                      Value == "NULL"))) %>%
  left_join(filter(., Value != "NULL") %>%
              pull(Value) %>%
              bind_rows(.id = "idx")) %>%
  select(-idx)

此处,dat是数据框的名称。

结果:

  U_ID      Value AD CT Cno#  cna   cf
1    1   50, jhon ia BG   50 jhon <NA>
2    1   50, guna AS DB   50 guna <NA>
3    2 30, rt, ty BN FV   30   rt   ty
4    2       NULL VF TY <NA> <NA> <NA>
5    3         30 RR TT   30 <NA> <NA>