【问题标题】:How do I create component (subset) dataframes in R based on column values?如何根据列值在 R 中创建组件(子集)数据框?
【发布时间】:2011-09-10 19:28:06
【问题描述】:

我想根据一列中的值将一个数据框拆分为多个组件数据框。 在我的示例中,我想使用“cond”列中的值将 dat 拆分为 dat.1、dat.2 和 dat.3。 有没有一个简单的命令可以做到这一点?

dat
sub cond    trial   time01  time02
1   1   1   2774    8845
1   1   2   2697    9945
1   2   1   2219    9291
1   2   2   3886    7890
1   3   1   4011    9032
2   2   1   3478    8827
2   2   2   2263    8321
2   3   1   4312    7576
3   1   1   4219    7891
3   3   1   3992    6674


dat.1               
sub cond    trial   time01  time02
1   1   1   2774    8845
1   1   2   2697    9945
3   1   1   4219    7891    

dat.2               
sub cond    trial   time01  time02
2   2   1   3478    8827
2   2   2   2263    8321
1   2   1   2219    9291
1   2   2   3886    7890

dat.3               
sub cond    trial   time01  time02
1   3   1   4011    9032
2   3   1   4312    7576
3   3   1   3992    6674

也许因为我是 R 新手,尽管浏览并尝试了几个类似论坛查询中提出的解决方案,但我仍然没有确定如何执行此操作。提前感谢您的任何回复。

一个dput()的数据是:

structure(list(sub = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L
), cond = c(1L, 1L, 2L, 2L, 3L, 2L, 2L, 3L, 1L, 3L), trial = c(1L, 
2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L), time01 = c(2774L, 2697L, 
2219L, 3886L, 4011L, 3478L, 2263L, 4312L, 4219L, 3992L), time02 = c(8845L, 
9945L, 9291L, 7890L, 9032L, 8827L, 8321L, 7576L, 7891L, 6674L
)), .Names = c("sub", "cond", "trial", "time01", "time02"), class = "data.frame", row.names = c(NA, 
-10L))

【问题讨论】:

    标签: r split subset


    【解决方案1】:

    我认为最简单的方法是通过split:

    split(dat, dat$cond)
    

    但是请注意,拆分会返回 data.frames 的列表。

    要从列表中获取单个 data.frames,您可以使用循环进行如下操作以生成单个对象(隐含在 lapply 语句中):

    tmp <- split(dat, dat$cond)
    lapply(1:length(tmp), function(x) assign(paste("dat.", x, sep = ""), tmp[[x]], envir = .GlobalEnv))
    

    不过,使用列表可能更适合Rish,从长远来看会更有用。

    感谢 Gavin 发布数据!

    【讨论】:

      【解决方案2】:

      有什么不满意的地方

      split(dat, dat$cond)
      

      ? 你确实有 R 和 split 作为标签,你知道...

      【讨论】:

        【解决方案3】:

        是的,split()。例如,如果你的数据在dat,那么:

        with(dat, split(dat, cond))
        

        返回一个列表,其组件是您想要的数据框:

        R> with(dat, split(dat, cond))
        $`1`
          sub cond trial time01 time02
        1   1    1     1   2774   8845
        2   1    1     2   2697   9945
        9   3    1     1   4219   7891
        
        $`2`
          sub cond trial time01 time02
        3   1    2     1   2219   9291
        4   1    2     2   3886   7890
        6   2    2     1   3478   8827
        7   2    2     2   2263   8321
        
        $`3`
           sub cond trial time01 time02
        5    1    3     1   4011   9032
        8    2    3     1   4312   7576
        10   3    3     1   3992   6674
        

        【讨论】:

        • @Same @Nick 击败了我们俩(如果初始时间正确,我领先 12 秒)
        • 感谢所有回复的人。 split() 解决了我的问题。我希望在某个时候我可以帮助提供 R 帮助。
        【解决方案4】:

        为了完整起见,这里有一种使用plyr 包的方法。

        require(plyr)
        
        > dlply( dat, .(cond))
        $`1`
          sub cond trial time01 time02
        1   1    1     1   2774   8845
        2   1    1     2   2697   9945
        9   3    1     1   4219   7891
        
        $`2`
          sub cond trial time01 time02
        3   1    2     1   2219   9291
        4   1    2     2   3886   7890
        6   2    2     1   3478   8827
        7   2    2     2   2263   8321
        
        $`3`
           sub cond trial time01 time02
        5    1    3     1   4011   9032
        8    2    3     1   4312   7576
        10   3    3     1   3992   6674
        
        attr(,"class")
        [1] "split" "list" 
        

        请注意语法的简单性,因为您只提到了一次 dat

        【讨论】:

          【解决方案5】:

          ;)

          ucond <- unique(dat$cond)
          dat_by_cond <- lapply(lapply(ucond, "==", dat$cond), subset, x=dat)
          names(dat_by_cond) <- paste("dat",ucond,sep=".")
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-20
            • 2019-07-01
            • 1970-01-01
            • 2013-01-10
            相关资源
            最近更新 更多