当我运行此循环时,我可以打印结果,并且我想使用此数据创建数据框,但是我不能。到目前为止,我有这个:
filenames <- list.files(path=getwd())
numfiles <- length(filenames)
for (i in 1:numfiles) {
file <- read.table(filenames[i],header = TRUE)
ts = subset(file, file$name == "plantNutrientUptake")
tss = subset (ts, ts$path == "//plants/nitrate")
tssc = tss[,2:3]
d40 = tssc[41,2]
print(d40)
print(filenames[i])
}
答案 0 :(得分:0)
这不是执行此操作的最有效方法,但是它利用了您已经编写的代码。首先,您将使用所需的列创建一个空的数据框,但将其填充为NA。然后,在循环的每次迭代中,您将填充数据帧的一行。
filenames <- list.files(path=getwd())
numfiles <- length(filenames)
# Create an empty data.frame
df <- data.frame(filename = rep(NA, numfiles), d40 = rep(NA, numfiles))
for (i in 1:numfiles){
file <- read.table(filenames[i],header = TRUE)
ts = subset(file, file$name == "plantNutrientUptake")
tss = subset (ts, ts$path == "//plants/nitrate")
tssc = tss[,2:3]
d40 = tssc[41,2]
# Fill row i of the data frame
df[i,"filename"] = filenames[i]
df[i,"d40"] = d40
}
希望能做到!祝你好运:)
答案 1 :(得分:0)
有很多方法可以完成您要问的事情。另外,如果没有可复制的示例,则很难验证代码是否将运行。我无法确定每个变量中的数据类型,所以我只是猜测它们主要是带有一个数字的字符。如果不正确,则需要更改代码。
以下方法使用的是基数R(没有其他软件包)。它基于您所做的工作。还有其他使用map
,do.call
或apply
的方法。但是能够循环运行很重要。
正如有人评论的那样,您的代码只是在每个循环中重新编写自己。幸运的是,您拥有变量i
,可用于指定事物的运行方向。
filenames <- list.files(path=getwd())
numfiles <- length(filenames)
# Declare an empty dataframe for efficiency purposes
df <- data.frame(
ts = rep(NA_character_,numfiles),
tss = rep(NA_character_,numfiles),
tssc = rep(NA_character_,numfiles),
d40 = rep(NA_real_,numfiles),
stringsAsFactors = FALSE
)
# Loop through the files and fill in the data
for (i in 1:numfiles){
file <- read.table(filenames[i],header = TRUE)
df$ts[i] <- subset(file, file$name == "plantNutrientUptake")
df$tss[i] <- subset (ts, ts$path == "//plants/nitrate")
df$tssc[i] <- tss[,2:3]
df$d40[i] <- tssc[41,2]
print(d40)
print(filenames[i])
}
您会注意到有关此代码的一些额外信息。
首先,我要明确声明每列的变量类型。您可以使用rep(NA,numfiles)
,但是让R猜测该列应该是什么。如果所有变量显然都是同一类型,那么这对您来说可能不是问题。但是,假设您有一个包含所有字符的变量a = c("1","A","B")
。 R将经历循环的第一次迭代,并猜测该列是数字。然后,在第二次运行循环时,遇到一个字符时将崩溃。
接下来,我将在进入循环之前声明整个数据帧。当人们告诉您[现代] R中的循环很慢时,通常是因为您要在每个循环中重新分配内存。通过预先声明整个数据帧,可以显着加快循环速度。这也使您可以引用数据框中的任何单元格……这正是您要在循环中执行的操作。
最后,我使用$
语法使事情变得清晰。编写df[i,"d40"] <- d40
与编写df$d40[i] <- d40
相同。我只是认为使用第二种方法很明显。这是个人喜好问题。