我正在尝试通过循环自动执行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
谢谢!
答案 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]]
}