R:使用lapply将新列添加到数据框列表中

时间:2015-02-22 00:45:25

标签: r

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

1 个答案:

答案 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(),这是一个零长度列。