我有多个数据框,我想在所有数据框中执行相同的操作,例如,将它们全部转换为data.tables(这只是一个示例,我也想应用其他函数)。
一个简单的例子可以是(df1 = df2 = df3,这里不失一般性)
df1 <- data.frame(var1 = c(1, 2, 3, 4, 5), var2 =c(1, 2, 2, 1, 2), var3 = c(10, 8, 15, 7, 9))
df2 <- data.frame(var1 = c(1, 2, 3, 4, 5), var2 =c(1, 2, 2, 1, 2), var3 = c(10, 8, 15, 7, 9))
df3 <- data.frame(var1 = c(1, 2, 3, 4, 5), var2 =c(1, 2, 2, 1, 2), var3 = c(10, 8, 15, 7, 9))
我的方法是:(i)创建数据框列表(list.df
),(ii)创建一个列表,列出之后应如何调用它们(list.dt
)和(iii) )循环进入这两个列表:
list.df:
list.df<-vector('list',3)
for(j in 1:3){
name <- paste('df',j,sep='')
list.df[j] <- name
}
list.dt
list.dt<-vector('list',3)
for(j in 1:3){
name <- paste('dt',j,sep='')
list.dt[j] <- name
}
循环(将所有数据帧转换为数据表):
for(i in 1:3){
name<-list.dt[i]
assign(unlist(name), setDT(list.df[i]))
}
我肯定做错了,因为这是三个数据表,包含1个变量,1个观察值(正好是名称list.df[i]
)。
我试图取消列出list.df
思考r
认为它是整个数据框而不仅仅是字符串:
for(i in 1:3){
name<-list.dt[i]
assign(unlist(name), setDT(unlist(list.df[i])))
}
但我收到错误消息:
Error in setDT(unlist(list.df[i])) :
Argument 'x' to 'setDT' should be a 'list', 'data.frame' or 'data.table'
有什么建议吗?
答案 0 :(得分:1)
您可以将所有数据放入一个数据框中。然后,如果要迭代数据帧,请使用dplyr :: do或者最好使用其他dplyr函数
library(dplyr)
data =
list(df1 = df2, df2 = df2, df3 = df3) %>%
bind_rows(.id = "source") %>%
group_by(source)
答案 1 :(得分:1)
将您的上一个代码段更改为:
for(i in 1:3){
name <- list.dt[i]
assign(unlist(name), setDT(get(list.df[[i]])))
}
答案 2 :(得分:1)
# Alternative to using lists
list.df <- paste0("df", 1:3)
# For loop that works with the length of the input 'list'/vector
# Creates the 'dt' objects on the fly
for(i in seq_along(list.df)){
assign(paste0("dt", i), setDT(get(list.df[i])))
}
答案 3 :(得分:1)
使用data.table
(应该获得更多广告):
a)如果您需要将所有data.frame
转换为data.table
,那么正如@ A5C1D2H2I1M1N2O1R2T1的注释中所建议的那样,请对{{1 }}个data.frame
setDT
b)如果您需要按行绑定library(data.table)
lapply(mget(paste0("df", 1:3)), setDT)
# or, if you wish to type them one by one:
lapply(list(df1, df2, df3), setDT)
class(df1) # check if coercion took place
# [1] "data.table" "data.frame"
,请使用data.frame
data.table::rbindlist
附带说明:如果您喜欢使用magrittr包(几乎总是与data <- rbindlist(mget(paste0("df", 1:3)), idcol = TRUE)
# or, if you wish to type them one by one:
data <- rbindlist(list(df1 = df1, df2 = df2, df3 = df3), idcol = TRUE)
语法结合使用)进行链接/配管,则如下所示:< / p>
dplyr