将数据帧添加到for循环中的列表中

时间:2014-07-08 04:01:53

标签: r dataframe

我有一个for循环,每次循环时都会生成一个数据帧。我正在尝试创建一个数据框列表,但我似乎无法找到一个很好的方法来做到这一点。

例如,对于向量,我通常会这样做:

my_numbers <- c()

for (i in 1:4){
 my_numbers <- c(my_numbers,i)
}

这将产生向量c(1,2,3,4)。我想用数据帧做类似的事情,但是当我使用时,访问数据帧列表非常困难:

my_dataframes <- list(my_dataframes,DATAFRAME).

请帮助。主要目标是创建一个数据帧列表,稍后我可以通过dataframe访问数据帧。谢谢。

3 个答案:

答案 0 :(得分:0)

我确信你已经注意到list没有做你想做的事情,也不应该做。 c在这种情况下也不起作用,因为它会使数据框变平,即使recursive=FALSE也是如此。

您可以使用append。如,

data_frame_list = list()
for( i in 1:5 ){
    d = create_data_frame(i)
    data_frame_list = append(data_frame_list,)
}

更好的是,您可以直接分配给索引元素,即使这些元素尚不存在:

data_frame_list = list()
for( i in 1:5 ){
    data_frame_list[[i]] = create_data_frame(i)
}

这也适用于矢量。但是,如果您想创建一个向量c(1,2,3,4),只需使用1:4或其基础函数seq

当然,lapply或来自*lply的{​​{1}}函数通常比循环更好,具体取决于您的应用。

答案 1 :(得分:0)

继续使用for循环方法,这里有一个创建和访问的小例子。

> my_numbers <- vector('list', 4)
> for (i in 1:4) my_numbers[[i]] <- data.frame(x = seq(i))

我们可以使用

访问每个数据框的第一列
> sapply(my_numbers, "[", 1)
# $x
# [1] 1
#
# $x
# [1] 1 2
#
# $x
# [1] 1 2 3
#
# $x
# [1] 1 2 3 4

第一个数据集的其他访问方式是my_numbers[[1]]  lapply(my_numbers, "[", 1,)访问每个数据框的第一行等。

答案 2 :(得分:0)

您可以为此使用运算符[[]]。

l <- list()
df1 <- data.frame(name = 'df1', a = 1:5 , b = letters[1:5])
df2 <- data.frame(name = 'df2', a = 6:10 , b = letters[6:10])
df3 <- data.frame(name = 'df3', a = 11:20 , b = letters[11:20])

df <- rbind(df1,df2,df3)

for(df_name in unique(df$name)){
  l[[df_name]] <- df[df$name == df_name,]
}

在此示例中,有三个单独的数据帧,为了存储它们 在使用for循环的列表中,我们将它们放在一个列表中。使用运算符[[我们甚至可以根据需要在列表中命名数据框,并将其正常存储在列表中。