r语言 - 将新列添加到数据框列表中,然后'unlist'名称保持不变?



我有许多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)))

相关内容

最新更新