我想使用在R

时间:2018-09-24 16:47:56

标签: r

当我运行此循环时,我可以打印结果,并且我想使用此数据创建数据框,但是我不能。到目前为止,我有这个:

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]) 
} 

2 个答案:

答案 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(没有其他软件包)。它基于您所做的工作。还有其他使用mapdo.callapply的方法。但是能够循环运行很重要。

正如有人评论的那样,您的代码只是在每个循环中重新编写自己。幸运的是,您拥有变量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相同。我只是认为使用第二种方法很明显。这是个人喜好问题。