我已阅读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的一列和类别的一列。
DataFrame 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
DataFrame 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。
答案 0 :(得分:4)
这是因为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())
})
由问题的作者添加:
可以根据需要完成一个空白列(&#34;&#34;) 其他列
SubCat = c("")
。但是,如果你有一个空的数据框, 您需要使用以下内容开始一个新列:SubCat = character()
,这是一个零长度列。