在For循环中的R中创建子集数据帧

时间:2018-07-25 14:47:22

标签: r

我要做的是根据较大数据帧中第一列的值将较大的数据帧过滤为78个唯一数据帧。我认为正确执行此操作的唯一方法是在filter()循环内应用for()函数:

 for (i in 1:nrow(plantline)) 
            {x1 = filter(rawdta.df, Plant_Line == plantline$Plant_Line[i])}

问题是我不知道如何在每次循环运行时创建一个新的数据帧,例如x2,x3,x4...。

有人可以告诉我这是否可行,或者我是否应该尝试其他方式?

6 个答案:

答案 0 :(得分:2)

这个问题必须有很多重复

split(plantline, plantline$Plant_Line)

将创建一个data.frames列表。

但是,根据使用情况,可能不需要将大的data.frame分成几部分,因为可以使用分组。

答案 1 :(得分:2)

您可以使用split-

# creates a list of dataframes into 78 unique data frames based on
# the value of the first column in the larger data frame
lst = split(large_data_frame, large_data_frame$first_column)

# takes the dataframes out of the list into the global environment
# although it is not suggested since it is difficult to work with 78 
# dataframes
list2env(lst, envir = .GlobalEnv)

数据框的名称将与第一列中变量的值相同。

答案 2 :(得分:0)

如果我们可以看到数据框,那会更容易。...

尽管如此,我还是提出了一些建议。您可以创建数据框列表:

dataframes <- vector("list", nrow(plantline))
for (i in 1:nrow(plantline)){ 
     dataframes[[i]] = filter(rawdta.df, Plant_Line == plantline$Plant_Line[i])
}

答案 3 :(得分:0)

您可以使用assign

for (i in 1:nrow(plantline)) 
        {assign(paste0(x,i), filter(rawdta.df, Plant_Line == plantline$Plant_Line[i]))}

或者,您也可以将结果保存在list中:

X <- list()    
for (i in 1:nrow(plantline)) 
        {X[[i]] = filter(rawdta.df, Plant_Line == plantline$Plant_Line[i])}

答案 4 :(得分:0)

使用示例数据会更容易。是我的最爱。

target

答案 5 :(得分:0)

使用plyr的解决方案:

ma <- cbind(x = 1:10, y = (-4:5)^2, z = 1:2)
ma <- as.data.frame(ma)

library(plyr)
dlply(ma, "z") # you split ma by the column named z