我已经阅读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/