R:从列值创建新行

时间:2016-05-23 18:42:10

标签: r

我有一个混乱的数据集,在一列中有多个值,用;分隔。我想为列中的每个单独值创建新行。例如:

    ID    Date        Dx
    1     10/1/15     anemia ; headache ;
    2     10/1/15     migraine ; anemia ;
    3     10/2/15     diabetes ; 

将返回:

    ID    Date      Dx
    1     10/1/15   anemia
    1     10/1/15   headache
    2     10/1/15   migraine
    2     10/1/15   anemia
    3     10/2/15   diabetes

非常感谢任何帮助。我是新手R用户,这让我很难过。

4 个答案:

答案 0 :(得分:3)

或使用?cSplit()包中的splitstackshape

library(splitstackshape)

cSplit(df, 3, ";", "long")
#   ID    Date       Dx
#1:  1 10/1/15   anemia
#2:  1 10/1/15 headache
#3:  2 10/1/15 migraine
#4:  2 10/1/15   anemia
#5:  3 10/2/15 diabetes

数据

df <- structure(list(ID = 1:3, Date = structure(c(1L, 1L, 2L), .Label = c("10/1/15", 
"10/2/15"), class = "factor"), Dx = structure(c(1L, 3L, 2L), .Label = c("anemia ; headache ;", 
"diabetes ;", "migraine ; anemia ;"), class = "factor")), .Names = c("ID", 
"Date", "Dx"), class = "data.frame", row.names = c(NA, -3L))

答案 1 :(得分:2)

您可以使用unnest包中的tidyr功能:

library(data.table); library(tidyr);
setDT(df)[, Dx := list(strsplit(as.character(Dx), ";"))]
df %>% unnest(Dx)

Source: local data frame [5 x 3]

     ID    Date       Dx
  (int)  (fctr)    (chr)
1     1 10/1/15   anemia
2     1 10/1/15 headache
3     2 10/1/15 migraine
4     2 10/1/15   anemia
5     3 10/2/15 diabetes

答案 2 :(得分:0)

您无需为此繁琐的任务使用任何其他包。只需使用:

data.frame(ID = rep(mydf$ID, sapply(strsplit(mydf$DX, split = ";"), length)),Date= rep(mydf$Date, sapply(strsplit(mydf$DX, split = ";"), length)), DX = unlist(strsplit(mydf$DX, split = ";")))

答案 3 :(得分:-1)

使用基础R你可以尝试:

if ($('.modal-box.opened').find('video').attr(autoplay) == true) {