将具有可变列名的列添加到列表中的数据框

时间:2019-07-26 22:06:24

标签: r

我有一个data.frames列表。

l <- list("a"=data.frame(a=1:2,b=1:2),"b"=data.frame(a=1:2,b=1:2))
l
$a
a b
1 1 1
2 2 2

$b
a b
1 1 1
2 2 2

我正在尝试为每个data.frames添加一列。列的名称在变量中定义。

我尝试了一下,但是没有用。

j=1
lapply(l,function(x) x[[paste0("Column",LETTERS[j])]] <- 0)

我对以上内容进行了拆分,以提高可读性。但这也不起作用。

cname <- paste0("Column",LETTERS[j])
fun1 <- function(x,y) x[[y]] <- 0
lapply(l,fun1,cname)

cbind方法可以与lapply()一起使用,但是我不太确定如何通过变量添加列名。这也显示了我正在寻找的输出。

lapply(l,function(x) cbind(x,ColumnA=0))

$a
  a b ColumnA
1 1 1       0
2 2 2       0

$b
  a b ColumnA
1 1 1       0
2 2 2       0

也许有人有更好的建议。

4 个答案:

答案 0 :(得分:2)

lhs上分配的一个选项是与:=一起使用,并求值{!!tidyverse中的字符串

library(purrr)
library(dplyr)
j <- 1
map(l, ~ .x %>% 
           mutate(!! str_c("Column",LETTERS[j]) := 0))
#$a
#  a b ColumnA
#1 1 1       0
#2 2 2       0

#$b
#  a b ColumnA
#1 1 1       0
#2 2 2       0

或者在base R中,修改fun1以在分配后返回数据集

fun1 <- function(x,y) {x[[y]] <- 0; x}
cname <-  paste0("Column",LETTERS[j])
lapply(l, fun1, y = cname)
#$a
#  a b ColumnA
#1 1 1       0
#2 2 2       0

#$b
#  a b ColumnA
#1 1 1       0
#2 2 2       0

答案 1 :(得分:1)

使用plyr ...

llply(l,function(x) data.frame(x,c=0))
$a
  a b c
1 1 1 0
2 2 2 0

$b
  a b c
1 1 1 0
2 2 2 0

答案 2 :(得分:1)

使用指示的参数将replace应用于l的每个组件。

lapply(l, replace, paste0("Column", LETTERS[j]), 0)

给予:

$a
  a b ColumnA
1 1 1       0
2 2 2       0

$b
  a b ColumnA
1 1 1       0
2 2 2       0

更新

修订。

答案 3 :(得分:0)

我们可以使用transformsetNames来更改列名

lapply(l, function(x) setNames(transform(x, temp = 0), c(names(x), cname)))

#$a
#  a b ColumnA
#1 1 1       0
#2 2 2       0

#$b
#  a b ColumnA
#1 1 1       0
#2 2 2       0

或仅更改最后一个列名

lapply(l, function(x) {transform(x, temp = 0);names(x)[ncol(x)] <- cname;x})