在r中的循环中使用list的元素(例如:setDT)

时间:2015-11-24 23:43:34

标签: r list loops data.table

我有多个数据框,我想在所有数据框中执行相同的操作,例如,将它们全部转换为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' 

有什么建议吗?

4 个答案:

答案 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