【问题标题】:R - make multiple elements list to data frame rows [duplicate]R - 使多个元素列表到数据框行[重复]
【发布时间】:2016-05-16 08:29:16
【问题描述】:

我有一个如下所示的数据框。

    A  B C
V1  a  1 e
V2  b  2 f
V3  c  3 g,h,i
V4  d  4 j,k

C 列中的数据类别为列表。

我想取消列出 C 列数据并像这样在数据框中创建多行。

    A  B C
V1  a  1 e
V2  b  2 f
V3  c  3 g
V4  c  3 h
V5  c  3 i
V6  d  4 j
V7  d  4 k

如何做到这一点?

非常感谢。

【问题讨论】:

    标签: r list


    【解决方案1】:

    我们可以使用cSplit

    library(splitstackshape)
    cSplit(df1, "C", sep=",", "long")
    #   A B C
    #1: a 1 e
    #2: b 2 f
    #3: c 3 g
    #4: c 3 h
    #5: c 3 i
    #6: d 4 j
    #7: d 4 k
    

    或使用unnest 来自tidyr

    library(tidyr)
    unnest(df1, C=strsplit(C, ","))
    #  A B C
    #1 a 1 e
    #2 b 2 f
    #3 c 3 g
    #4 c 3 h
    #5 c 3 i
    #6 d 4 j
    #7 d 4 k
    

    或者base R

    lst <- strsplit(df1$C, ",")
    transform(df1[rep(1:nrow(df1), lengths(lst)),-3], C= unlist(lst))
    #     A B C
    #V1   a 1 e
    #V2   b 2 f
    #V3   c 3 g
    #V3.1 c 3 h
    #V3.2 c 3 i
    #V4   d 4 j
    #V4.1 d 4 k
    

    注意:如果“C”列是factor,则转换为character 并在strsplit 中使用它,即strsplit(as.character(df1$C), ",")

    更新

    假设如果“C”列是list,我们仍然可以使用unnest

    unnest(df2, C)
    #  A B C
    #1 a 1 e
    #2 b 2 f
    #3 c 3 g
    #4 c 3 h
    #5 c 3 i
    #6 d 4 j
    #7 d 4 k
    

    或与listCol_l 来自splitstackshape

    listCol_l(df2, "C")[]
    

    数据

    df1 <- structure(list(A = c("a", "b", "c", "d"), B = 1:4, C = c("e", 
    "f", "g,h,i", "j,k")), .Names = c("A", "B", "C"), 
    class = "data.frame",   row.names = c("V1", "V2", "V3", "V4"))
    
    df2 <- structure(list(A = c("a", "b", "c", "d"), B = 1:4, C = list("e", 
    "f", c("g", "h", "i"), c("j", "k"))), .Names = c("A", "B", 
    "C"), row.names = c("V1", "V2", "V3", "V4"), class = "data.frame")
    

    【讨论】:

    • 谢谢。但结果是 c('g' 'h' 'i') 分布在三行中。我只想在每一行上加上 g h i,而不是在 c()
    • @LuisKang 我得到了你所展示的预期结果
    • unnest(df2, C) 此代码有效!非常感谢!
    【解决方案2】:

    用途:

    s <- strsplit(df$C, split = ",")
    data.frame(A = rep(df$A, sapply(s, length)), C = unlist(s))
    

    【讨论】:

    • 这会丢失 B 列 ....
    • @ProcrastinatusMaximus 由于 col A 和 B 总是相同的(在问题中)我认为他们可能只是稍后添加缺少的列。
    猜你喜欢
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多