快速提问。我有以下内容:
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的列内容从行创建多个数据帧(即“a”,“d”等的df等)。
同时,我还想根据B列中的相应值命名数据框(对于从“a”创建的数据框,df将命名为“a”。
我尝试根据这里提供的答案Using a loop to create multiple data frames in R使其工作,但我没有运气。
如果有帮助,我会使用levels()和nlevels()创建的变量在循环中使用,以根据数据的变化保持可伸缩性。任何帮助将非常感激。
谢谢!
答案 0 :(得分:2)
这应该做:
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
更加直观。
干杯