我已经阅读this并创建了一个lapply函数,用于向列表中的每个数据帧添加“SubCat”列。

这是我的代码:

    my_list <- lapply(1:length(my_list),
               function(i) cbind(my_list[[i]], my_list[[i]]["SubCat"] <- as.character("")))

但是得到这个错误:
Error in `[<-.data.frame`(`*tmp*`, "SubCat", value = "") :
  replacement has 1 row, data has 0

怎么了?

当我使用它时,它在单个数据帧上起作用:
my_list[[1]]["SubCat"] <- as.character("")

更新:

这些是我的数据帧的示例,它们都包含相同的结构。一列用于SKU,一列用于类别。

数据框1:
    row.names       SKU         Tv.y.Video
1   1699        2018143169254P  Tv.y.Video
2   1700        2018143169254   Tv.y.Video
3   1946        2018144678120P  Tv.y.Video
4   1947        2018144678120   Tv.y.Video
5   2366        2018146411831P  Tv.y.Video
6   2367        2018146411831   Tv.y.Video

数据框2:
    row.names   SKU             C�mputo
1     6       2004121460000P    C�mputo
2     7       2004121460000     C�mputo
3     8       2004121440002P    C�mputo
4     9       2004121440002     C�mputo
5     10      2004123030003P    C�mputo
6     11      2004123030003     C�mputo

当我将代码仅应用到一个df时,它可以工作:
my_list[[1]]["SubCat"] <- as.character("")

结果:
    row.names       SKU         Tv.y.Video    SubCat
1   1699        2018143169254P  Tv.y.Video
2   1700        2018143169254   Tv.y.Video
3   1946        2018144678120P  Tv.y.Video
4   1947        2018144678120   Tv.y.Video
5   2366        2018146411831P  Tv.y.Video
6   2367        2018146411831   Tv.y.Video

更新1:

我在列表中还有一些空的data.frames。

最佳答案

这是因为my_list[[1]]["SubCat"] <- as.character("")不返回任何内容,因此,在对表达式求值后,您将NULL作为数据,并且cbind进程无法相应执行它。另外,lapply将为列表中的每个data frame执行函数,因此您的命令应如下所示:

vec.1 <- c(1, 2)
vec.2 <- c(2, 3)
df.1 <- data.frame(vec.1, vec.2)
df.2 <- data.frame(vec.2, vec.1)
my_list <- list(df.1, df.2)
## This is the correct use of lapply for your list
my_list <- lapply(my_list, cbind, SubCat = c(""))
my_list
[[1]]
  vec.1 vec.2 SubCat
1     1     2
2     2     3

[[2]]
  vec.2 vec.1 SubCat
1     2     1
2     3     2

编辑:lapply将列表作为参数,并将一个函数应用于列表的每个元素。但是,cbind需要两个参数。附加参数与lapply一起传递。现在,您可能会注意到SubCat向量由一个空字符串组成;可以,因为R根据需要重复该向量多次。

编辑#2:
嗯,这个错误很可能是由空的data.frames引起的,我没有考虑到。您可以这样做来解决您的问题(我没有考虑到向量不能自我重复零次):
my_list <- lapply(my_list, function(df){
    if (nrow(df) > 0)
        cbind(df, SubCat = c(""))
    else
        cbind(df, SubCat = character())
    })

由问题的作者添加:

关于R:使用lapply将新列添加到数据帧列表中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28653217/

10-11 13:59
查看更多