2017-07-07 133 views
0

快速问题。我有以下几点:使用循环从单个数据集创建多个数据框

a <- c(1,5,2,3,4,5,3,2,1,3) 
b <- c("a","a","f","d","f","c","a","r","a","c") 
c <- c(.2,.6,.4,.545,.98,.312,.112,.4,.9,.5) 
df <- data.frame(a,b,c) 

什么,我希望做的是利用一个for循环来创建行基于B列的列内容(多个数据帧,即对于一个DF“一”的“ d“等等)。

同时,我也想命名基于从塔B的对应值(DF将被命名为数据帧的“a”为从“一”。

我创建的数据帧尝试使它的工作基于这里提供的答案Using a loop to create multiple data frames in R,但我没有运气

如果它有帮助,我有变量创建levels()和nlevels()用于循环,以保持它的可扩展性基于我数据变化,任何帮助将不胜感激

谢谢!

+3

'list2env(分割(DF,DF $ B),ENVIR = .GlobalEnv)' –

+7

这往往是更好的*不*拆分这样的数据,而是使用工具,如'dplyr'的'group_by'当你想为每个'b'组做单独的计算时。 – Marius

+0

感谢所有帮助家伙! – AdeliciousNom

回答

0

这应该这样做:

require(dplyr) 

df$b <- as.character(df$b) 

col.filters <- unique(df$b) 

lapply(seq_along(col.filters), function(x) { 
    filter(df, b == col.filters[x]) 
    } 
) -> list 

names(list) <- col.filters 

list2env(list, .GlobalEnv) 

当然,你不需要dplyr做到这一点。你可以只使用基本语法:

df$b <- as.character(df$b) 

col.filters <- unique(df$b) 

lapply(seq_along(col.filters), function(x) { 
    df[df[, "b"] == col.filters[x], ] 
    } 
) -> list 

names(list) <- col.filters 

list2env(list, .GlobalEnv) 

但我发现dplyr更加直观。

干杯

+0

@d.b的例子是IMO更加优雅。 – JdM

+0

非常感谢!我很欣赏有两种方法可以解决这个问题。我从来没有想过使用dplyr:| – AdeliciousNom

相关问题