我有一个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访问数据帧。谢谢。
答案 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循环的列表中,我们将它们放在一个列表中。使用运算符[[我们甚至可以根据需要在列表中命名数据框,并将其正常存储在列表中。