从列表中将对象提取到数据框

时间:2020-10-13 12:06:07

标签: r list dataframe

我正在尝试通过循环自动执行R中的进程。我想做的是使R读取每个数据帧,将其插入列表中,以便稍后使用。

datalist <- list(length = 4)

datalist[[1]] <- read.csv("df1.csv", sep=',', header=F)
datalist[[2]] <- read.csv("df2.csv", sep=',', header=F)
datalist[[3]] <- read.csv("df3.csv", sep=',', header=F)
datalist[[4]] <- read.csv("df4.csv", sep=',', header=F)

这工作得很好,但是当我尝试在for循环中使用它时,它说我不能将元素带到列表中并创建数据框,

for (i in 1:nrow(datalist)) {
  
  inputdata <- data[[i]]

}

返回的错误为Error in data[i] : object of type 'closure' is not subsettable

数据框非常简单,我将向您展示一个人的head,以防万一,它是一个值,并用不同的列说明了不同的条件,尽管我不认为这与这种情况。

> head(df)
       V1 V2 V3 V4 V5 V6
1 0.40955  1  1  1  1  1
2 0.55674  1  1  1  2  1
3 0.53575  1  1  1  3  1
4 0.36518  1  2  1  1  1
5 0.49821  1  2  1  2  1
6 0.61912  1  2  1  3  1

谢谢!

2 个答案:

答案 0 :(得分:1)

您的循环应如下:

input_list <- c("df1.csv", "df2.csv", "df3.csv", "df4.csv")
datalist <- lapply(input_list, read.csv, sep=',', header=F)

循环的问题是data是R中的一个函数。

因此,如果您使用data而不创建对象调用data,则R会认为您正在调用该函数。

如果要使用创建一个for循环来读取每个输入,则应尝试以下方式:

input_list <- c("df1.csv", "df2.csv", "df3.csv", "df4.csv")
datalist <- list(length = length(input_list))


for (i in seq_along(input_list){
  datalist[i] <- read.csv(input_list[i], sep=',', header=F)
}

然而,使用lapply的解决方案更为优雅,通常比该解决方案更可取。

答案 1 :(得分:1)

循环中有两个问题:

首先,nrow(datalist)NULL,因此您的循环不会遍历列表中的每个项目。您应该只使用length(datalist)

> nrow(datalist)
NULL
> length(datalist)
[1] 4

第二,如注释中所述,您使用的是data而不是datalist。以下将为您工作:

for (i in 1:length(datalist)) {
  inputdata <- datalist[[i]]
}