【问题标题】:Adding rows to dataframes in a list向列表中的数据框添加行
【发布时间】:2016-02-17 02:37:42
【问题描述】:

我有一个空数据框 x0:x10 的列表 (xlist)。我还填充了数据框y(大约 13,000 行)。所有数据框都有列数和列标题。

 y  Date  Time  Correct  Incorrect  Average  Score  EC  E1?  E2?  E3?
[1] 10/1  1:14     8         2         15     80    0   y    n    y
[2] 10/2  8:45     5         5         12     50    1   n    y    y

我正在尝试将y 的每一行复制到xlist 中的一个数据帧中。

for (i in 1:nrow(y)) {
    xlist(paste0("x",y[i,3])) <- rbind(xlist(paste0("x",y[i,3])), y[i,]))
}

基本上,根据“正确”列中的数字,我想将该行复制到xlist 中的相应数据框中(所以第一行到x8,第二行到x5)。

数据框列表的问题在于它没有在这里将它们作为数据框读取

> class(xlist[x1])
[1] "list"

但它在环境面板中

xlist    list of 11
x0: 'data.frame' 0 obs of 10 variables:
..$ etc
x1: 'data.frame' 0 obs of 10 variables:
..$ etc
etc

使用上面的复制代码会抛出“要替换的项目数不是替换长度的倍数”。一些重写得到了“参数列数不匹配”(不确定如何)。所以我尝试创建自己的 AddRow 函数来查看rbind 是否是问题所在:

AddRow <- function(DF,NewRow) {
  DF[nrow(DF) + 1] <- NewRow
  DF
}

但它会引发“矩阵中的下标数不正确”错误。

如何将y 的所有行复制到xlist 内的相应数据框中?

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    我没有找到确切的答案,但我想出了一个更有效的解决方法,因为在迭代之后我不再需要该列表(而是实际的 x 数据帧本身)。我发现了 sqldf 包。

    通过根本不使用框架列表,我得到了我需要的列表。

    for (i in 0:10) {
        assign(paste0("x",i),
               sqldf(paste0("select * from y where Correct = ", i)))
    }
    

    这将创建 11 个数据帧,命名为 x0 到 x10,每个数据帧都通过 SQL 查询自动填充。

    【讨论】:

    • split(y, y$Correct) 会将数据框 y 拆分为一个数据框列表,每个数据框都有一个单独的值 Correct。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2017-05-17
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    相关资源
    最近更新 更多