我有许多dfs,我想在其中添加一列。为了mrp,这些dfs被称为df_1、df_2、df_3…
for (i in 1:10) {
assign(paste("df_",i,sep = ""),data.frame(x = rep(1,10), y = rep(2,10)))
}
我想为每个dfs添加另一列z。
z <- rep("hello",10)
我怎样才能做到这一点?
使用lapply,我已经能够完成这个
q <- list()
for (i in 1:10) {
q[[i]] <- assign(paste("df_",i,sep = ""),data.frame(x = rep(1,10), y = rep(2,10)))
}
z <- rep("hello",10)
q <- lapply(q, cbind,z)
这添加了必需的列,但是,我不知道如何保留这些名称。我怎么还能有df_1、df_2等,但每个都有一个新的列z?
提前感谢
使用`[<-`()
。
q <- lapply(q,`[<-`, 'z', value=rep("hello", 10))
提供
str(q)
# List of 10
# $ :'data.frame': 10 obs. of 3 variables:
# ..$ x: num [1:10] 1 1 1 1 1 1 1 1 1 1
# ..$ y: num [1:10] 2 2 2 2 2 2 2 2 2 2
# ..$ z: chr [1:10] "hello" "hello" "hello" "hello" ...
# $ :'data.frame': 10 obs. of 3 variables:
# ..$ x: num [1:10] 1 1 1 1 1 1 1 1 1 1
# ..$ y: num [1:10] 2 2 2 2 2 2 2 2 2 2
# ..$ z: chr [1:10] "hello" "hello" "hello" "hello" ...
# ...
这是有效的,因为`[<-`(df_1, 'z', value=z)
与df_1[['z']] <- z
相似。(实际上我们使用的是base:::`[<-.data.frame()`
。(
注意:使用replicate
:可能会获得更便宜的q
n <- 3
q <- replicate(n, data.frame(x=rep(1, 3), y=rep(2, 3)), simplify=FALSE) |>
setNames(paste0('df_', 1:n))
q
# $df_1
# x y
# 1 1 2
# 2 1 2
# 3 1 2
#
# $df_2
# x y
# 1 1 2
# 2 1 2
# 3 1 2
#
# $df_3
# x y
# 1 1 2
# 2 1 2
# 3 1 2
或者,您可以稍微调整自己的列表方法,以便也存储数据帧的名称:
q <- list()
for (i in 1:10) {
q[[paste0('df_', i)]] <- data.frame(x = rep(1,10), y = rep(2,10))
}
z <- rep("hello",10)
q <- lapply(q, cbind,z)
编辑:使用@jay.sf提到的list2env
,将dfs返回到全局环境。
list2env(q , .GlobalEnv)
功能与@jay.sf的答案相同,稍微更详细/代码行数更多,但使用transform()
可能更容易理解。
# create dataframes
for (i in 1:10) {
assign(paste("df_",i,sep = ""),data.frame(x = rep(1,10), y = rep(2,10)))
}
# store dataframes into a list (only objects starting with df_)
df_list <- mget(ls(pattern="^df_"))
# add new column to each dataframe
lapply(df_list, (x) transform(x, z = rep("hello", 10)))