【问题标题】:split data.frame into list based on row values across columns根据跨列的行值将 data.frame 拆分为列表
【发布时间】:2016-02-10 00:28:52
【问题描述】:

我想根据 data.frame 的所有列中的行值/字符将 data.frame 拆分为一个列表。

我使用 write.list {erer} 将 data.frames 列表写入文件

所以现在当我再次阅读它们时,它们看起来像这样:

虚拟数据

set.seed(1)
df <- cbind(data.frame(col1=c(sample(LETTERS, 4),"col1",sample(LETTERS, 7))),
            data.frame(col2=c(sample(LETTERS, 4),"col2",sample(LETTERS, 7))),
            data.frame(col3=c(sample(LETTERS, 4),"col3",sample(LETTERS, 7))))
   col1 col2 col3
1     G    E    Q
2     J    R    D
3     N    J    G
4     U    Y    I
5  col1 col2 col3
6     F    M    A
7     W    R    J
8     Y    X    U
9     P    I    H
10    N    Y    K
11    B    T    M
12    E    E    Y

我想通过c("col1","col2","col3") 拆分成列表

[[1]]
       col1 col2 col3
    1     G    E    Q
    2     J    R    D
    3     N    J    G
    4     U    Y    I

[[2]]     
       col1 col2 col3
    1     F    M    A
    2     W    R    J
    3     Y    X    U
    4     P    I    H
    5     N    Y    K
    6     B    T    M
    7     E    E    Y

感觉使用split 应该很简单,但到目前为止我的尝试都失败了。另外,如您所见,我无法按某个行间隔进行拆分。

任何指点将不胜感激,谢谢!

【问题讨论】:

    标签: r list split dataframe


    【解决方案1】:

    试试

    lapply(split(d1, cumsum(grepl(names(d1)[1], d1$col1))), function(x) x[!grepl(names(d1)[1], x$col1),])
    #$`0`
    #  col1 col2 col3
    #1    G    E    Q
    #2    J    R    D
    #3    N    J    G
    #4    U    Y    I
    
    #$`1`
    #   col1 col2 col3
    #6     F    M    A
    #7     W    R    J
    #8     Y    X    U
    #9     P    I    H
    #10    N    Y    K
    #11    B    T    M
    #12    E    E    Y
    

    【讨论】:

    • 似乎不太一般;如果第一列的值例如是color 并且是合法的,那么在我看来,data.frame 将被错误地拆分。无论如何 +1。
    • 谢谢!在示例数据上完美运行,但对于我的真实数据来说不够通用。 +1
    • @jO 最好展示一个模仿原始数据集的例子。
    【解决方案2】:

    这应该是通用的,如果你想分割一行是否与colnames完全一样:

    dfSplit<-split(df,cumsum(Reduce("&",Map("==",df,colnames(df)))))
    for (i in 2:length(dfSplit)) dfSplit[[i]]<-dfSplit[[i]][-1,]
    

    正如@DavidArenburg 在 cmets 中建议的那样,第二行可以写得更 R 风格。

    dfSplit[-1] <- lapply(dfSplit[-1], function(x) x[-1, ])
    

    如果dfSplit 的长度为 1(与我原来的第二行相反,这会引发错误),它还有一个额外的好处是什么都不做。

    【讨论】:

      猜你喜欢
      • 2023-02-17
      • 2020-02-10
      • 1970-01-01
      • 2015-05-13
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多