R:循环遍历多个数据帧,保存到列表

时间:2016-02-14 23:53:35

标签: r

我正在尝试对多个数据帧执行简单的for循环,并将输出(从所有数据帧)保存到一个列表中。

以下是示例数据:

# Two example data frames (variables x and y)
a <- data.frame(x=rnorm(1:100, 10, 1), y=1:100)
b <- data.frame(x=rnorm(1:100, 500, 50), y=1:100)

# Merging data frames to a list, which we aim to loop through
data_frame_list <- list(a, b)

# Desired list
new_list <- list()

# The loop
# I want two simple values from each data frame (value1 and value2)
for(i in data_frame_list) {
     for(j in 1:5) {
          value1 = i[j,1]
          value2 = i[j,2]
          new_list[i] <- cbind(value1, value2)
     }
}

因此,从每个数据帧,我想要所有 j 值(1到5)的value1和value2。我想将所有提取的数据放在一个列表中(new_list)。

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

其他答案很有帮助,但我想尝试帮助您修复for循环。

for(i in 1:length(data_frame_list)) {
   for(j in 1:5) {
      value1 = data_frame_list[[i]][j,1]
      value2 = data_frame_list[[i]][j,2]
      new_list[[5*(i-1)+j]] = c(value1, value2)
   }
}

与您的代码存在一些差异:

  • 你需要通过使用[[,即双括号,而不是单括号,[。]进行子集化来分配列表的下一个元素。在你的代码中,我得到了一个“无效的下标类型'列表'”错误,我很确定这是由于这个原因。
  • cbind创建一个您可能不想要的数据结构 - 如果您只是想要这些值,可能更容易使用c()创建一个向量
  • 在您的代码中,new_list值将在外部循环的第二次迭代中被替换。为了解决这个问题,我需要使用子集来访问循环内的数据帧。这允许我扩展列表的长度,以便它附加第二个数据帧的元素。

希望这会有所帮助。

答案 1 :(得分:1)

您是否尝试选择前5列数据框a和b?

如果是这样,试试这个:

new_list <- cbind(a[, 1:5], b[, 1:5])

答案 2 :(得分:1)

如果我正确读出了您的问题,那么您正试图从列表data_frame_list的每个元素中获取前5行数据(包括列)。如果是这样,那么这可能会有所帮助:

for(i in data_frame_list) { new_list <- i[1:5, ]} 它提供了一个新列表,其中只包含第一个列表中每个元素的前5行(包括列)。该列表要变大,它应该包含每个新列表的前五个元素。

希望它有所帮助!