重复在R中分配数据帧

时间:2016-05-19 19:34:39

标签: r loops object

我是R和stackoverflow的新手,所以这可能会有一个非常简单的解决方案。

我有来自20个不同主题的一组数据。在将来,我将不得不对这些数据执行许多不同的操作,并且必须对所有单个集重复此操作。分别分析它们并重新组合它们。 我的问题是如何自动化这个过程: P4 <- read.delim("P4Rtest.txt") P7 <- read.delim("P7Rtest.txt") P13 <- read.delim("P13Rtest.txt") 等等等。

我尝试使用for循环进行循环,但看到每次创建一个具有唯一名称的新data.frame时都会陷入困境。

感谢您的帮助

3 个答案:

答案 0 :(得分:5)

执行此操作的R方法是将所有数据集保存在命名列表中。为此,您可以使用以下内容,其中n是文件数。

nm <- paste0("P", 1:n)  ## create the names P1, P2, ..., Pn
dfList <- setNames(lapply(paste0(nm, "Rtest.txt"), read.delim), nm)

现在dfList将包含所有数据集。您可以使用dfList$P1 P1dfList$P2 P2依次访问它们,依此类推。

答案 1 :(得分:0)

有很多不同的方法可以做这样的事情。您可以使用rbind将所有数据合并到一个数据框中。这里的第一个答案有一个很好的方法:Replace rbind in for-loop with lapply? (2nd circle of hell)

如果将所有内容组合到一个数据框中,则需要添加标识参与者的列。而不是

P4 <- read.delim("P4Rtest.txt")
...

你会有像

这样的东西
my.list <- vector("list", number.of.subjects)
for(participant.number in 1:number.of.subjects){
    # load individual participant data
    participant.filename = paste("P", participant, "Rtest.txt", sep="")
    participant.df <- read.delim(participant.filename)
    # add a column:
    participant.df$participant.number = participant.number
    my.list[[i]] <- participant.df
}
solution <- rbind(solution, do.call(rbind, my.list))

如果由于某种原因想要将它们保留为单独的数据框,可以将它们保留在列表中(不要使用最后rbind行),并在需要对其进行操作时使用lapply(my.list, function(participant.df) { stuff you want to do })数据框。

答案 2 :(得分:-2)

您可以使用assign。假设您的所有文件都具有与您显示的格式相似的格式,这将适合您:

# Define how many files there are (with the numbers).
numFiles <- 10

# Run through that sequence.
for (i in 1:numFiles) {

  fileName <- paste0("P", i, "Rtest.txt") # Creating the name to pull from.
  file <- read.delim(fileName) # Reading in the file.
  dName <- paste0("P", i) # Creating the name to assign the file to in R.
  assign(dName, file) # Creating the file in R.

}

还有其他方法更快,更紧凑,但我发现它更易读,特别是对于R新手。

此外,如果您的数字不是像我在这里使用过的完整序列,您只需定义一个使用数字的向量,如:

numFiles <- c(1, 4, 10, 25)