使用lapply向数据框列表中添加新列

7

我已经阅读了这篇文章,并创建了一个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

当我将代码应用于一个数据框时,它可以正常工作:

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。

1个回答

5

这是因为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: 嗯,这个错误可能是来自我没有考虑到的空数据框。你可以这样做来解决你的问题(我没有考虑到一个向量不能重复零次):

my_list <- lapply(my_list, function(df){
    if (nrow(df) > 0)
        cbind(df, SubCat = c(""))
    else
        cbind(df, SubCat = character())
    })

问题作者添加:

如果根据其他列SubCat = c("")填充一个带有空白("")的列是可以的。但是,如果你有一个空的数据框,你需要开始一个新的列:SubCat = character(),这是一个长度为零的列。


我得到了一个不同的错误:Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 1 - Omar Gonzales
我已经完成了,检查一下告诉我是否可以正常工作。 - Omar Gonzales
你的列表里有没有空数据框? - codingEnthusiast
是的,我有超过10个,我想我应该提到这一点。 - Omar Gonzales
是的,那可能是错误的原因。最后一段代码应该能为您完成任务,首先检查当前数据框是否为空。如果您有任何问题,请随时评论。 - codingEnthusiast
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接