动态子集取决于R中的值

时间:2014-06-06 19:59:00

标签: r dynamic subset

我有一个带有下一个结构的数据框

    Id    Flag    value1   value2
    123    1       10        3.4
    124    1        5        1.2
    125    0       19        8.4
    126    1        8        1.2
    127    0       17        6.5
    128    2        1       -6.5

我需要将数据框分成'n'个子集,这仅取决于列的名称,其中'n'是列的不同值,我希望如下:

    dataframe1
    Id    Flag    value1   value2
    123    1       10        3.4
    124    1        5        1.2
    126    1        8        1.2

    dataframe2
    Id    Flag    value1   value2
    125    0       19        8.4
    127    0       17        6.5

    dataframe3
    Id    Flag    value1   value2
    128    2        1       -6.5

由于这是在函数内部,我只知道列的名称和它可以采用的不同值,我试过了:

    dataFrame$column==value

但我需要为每个值执行此操作,并且值的长度是动态的,具体取决于列的名称。

提前致谢

2 个答案:

答案 0 :(得分:3)

在这里,split是你的朋友。

splitbycol <- function(df, colname) {
   split(df, df[[colname]])
}

splitbycol(df, "Flag")
## $`0`
##    Id Flag value1 value2
## 3 125    0     19    8.4
## 5 127    0     17    6.5
## 
## $`1`
##    Id Flag value1 value2
## 1 123    1     10    3.4
## 2 124    1      5    1.2
## 4 126    1      8    1.2
## 
## $`2`
##    Id Flag value1 value2
## 6 128    2      1   -6.5

然后,如果您想将每个数据框作为单独的“变量”,请致电,例如

subdf <- splitbycol(df, "Flag")
for (i in seq_along(subdf))
   assign(paste0("df", i), subdf[[i]])
df1
##    Id Flag value1 value2
## 3 125    0     19    8.4
## 5 127    0     17    6.5

答案 1 :(得分:1)

避免for循环的另一种方法

> List <- split(df, df$Flag)                            # split 
> names(List) <- paste0("dataframe", seq_along(List))   # naming (use seq_along better)
> list2env(List, envir=.GlobalEnv)                      # from list to data.frame

> dataframe1
#    Id Flag value1 value2
#3 125    0     19    8.4
#5 127    0     17    6.5
> dataframe2
#   Id Flag value1 value2
#1 123    1     10    3.4
#2 124    1      5    1.2
#4 126    1      8    1.2
> dataframe3
#    Id Flag value1 value2
# 6 128    2      1   -6.5