首页 文章

通过其中一个列的值对数据框进行子集

提问于
浏览
1

我有一个相当大的数据框架 . 这是一个简化的例子:

Group Element Value Note
1     AAA     11    Good
1     ABA     12    Good
1     AVA     13    Good
2     CBA     14    Good
2     FDA     14    Good
3     JHA     16    Good
3     AHF     16    Good
3     AKF     17    Good

这是 dput

dat <- structure(list(Group = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L), Element = structure(c(1L, 
2L, 5L, 6L, 7L, 8L, 3L, 4L), .Label = c("AAA", "ABA", "AHF", 
"AKF", "AVA", "CBA", "FDA", "JHA"), class = "factor"), Value = c(11L, 
12L, 13L, 14L, 14L, 16L, 16L, 17L), Note = structure(c(1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L), .Label = "Good", class = "factor")), .Names = c("Group", 
"Element", "Value", "Note"), class = "data.frame", row.names = c(NA, 
-8L))

我试图根据小组分开它 . 所以我们说吧

第1组将是一个数据框:

Group Element Value Note
1     AAA     11    Good
1     ABA     12    Good
1     AVA     13    Good

第2组:

2     CBA     14    Good
2     FDA     14    Good

等等 .

2 回答

  • 1

    你可以使用 split .

    > dat
    ##   Group Element Value Note
    ## 1     1     AAA    11 Good
    ## 2     1     ABA    12 Good
    ## 3     1     AVA    13 Good
    ## 4     2     CBA    14 Good
    ## 5     2     FDA    14 Good
    ## 6     3     JHA    16 Good
    ## 7     3     AHF    16 Good
    ## 8     3     AKF    17 Good
    
    > x <- split(dat, dat$Group)
    

    然后,您可以使用 x[[1]]x[[2]] 等按组编号访问每个单独的数据框 .
    例如,这是第2组:

    > x[[2]]  ## or x[2]
    ##   Group Element Value Note
    ## 4     2     CBA    14 Good
    ## 5     2     FDA    14 Good
    

    ADD: 由于您在评论中询问了这一点,因此您可以使用 write.csvlapply 将每个单独的数据框写入文件 . invisible 包装器只是为了抑制 lapply 的输出

    > invisible(lapply(seq(x), function(i){
          write.csv(x[[i]], file = paste0(i, ".csv"), row.names = FALSE)
      }))
    

    我们可以看到文件是通过查看 list.files 创建的

    > list.files(pattern = "^[0-9].csv")
    ## [1] "1.csv" "2.csv" "3.csv"
    

    我们可以看到第三组的数据框 read.csv

    > read.csv("3.csv")
    ##   Group Element Value Note
    ## 1     3     JHA    16 Good
    ## 2     3     AHF    16 Good
    ## 3     3     AKF    17 Good
    
  • 3

    必要的 plyr 版本(相当于理查德's, but I' ll打赌它也慢了:

    library(plyr)
    
    groups <- dlply(dat, .(Group), function(x) { return(x) })
    
    length(groups)
    ## [1] 3
    
    groups$`1` # can also do groups[[1]]
    ##   Group Element Value Note
    ## 1     1     AAA    11 Good
    ## 2     1     ABA    12 Good
    ## 3     1     AVA    13 Good
    
    groups[[2]]
    ##   Group Element Value Note
    ## 1     2     CBA    14 Good
    ## 2     2     FDA    14 Good
    

相关问题