我有一个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
也许有人有更好的建议。
答案 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)
我们可以使用transform
和setNames
来更改列名
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})