【问题标题】:R data.table: subsetting data.table/dataframe based on size of row valueR data.table:根据行值的大小对 data.table/dataframe 进行子集
【发布时间】:2017-12-23 22:35:15
【问题描述】:

这是一个基本问题,但我很难过:

我有以下 R 数据表:

library(data.table)
DT <- fread('unique_point biased    data_points   team   groupID                                                                                                           
 up1          FALSE     3             A      xy28352                                                                                                                 
 up1          TRUE      4             A      xy28352                                                                                                                 
 up2          FALSE     1             A      xy28352                                                                                                                  
 up2          TRUE      0             X      xy28352                                                                                                                  
 up3          FALSE     12            Y      xy28352                                                                                                                 
 up3          TRUE      35            Z      xy28352')

输出为

> DT
   unique_point biased data_points team groupID
1:          up1  FALSE           3    A xy28352
2:          up1   TRUE           4    A xy28352
3:          up2  FALSE           1    A xy28352
4:          up2   TRUE           0    X xy28352
5:          up3  FALSE          12    Y xy28352
6:          up3   TRUE          35    Z xy28352

team 列的值是字母 A 到 Z,有 26 种可能性。眼下。如果我用这段代码计算行值:

DT[, counts := .N, by=c("team")]

给了

> DT
   unique_point biased data_points team groupID counts
1:          up1  FALSE           3    A xy28352      3
2:          up1   TRUE           4    A xy28352      3
3:          up2  FALSE           1    A xy28352      3
4:          up2   TRUE           0    X xy28352      1
5:          up3  FALSE          12    Y xy28352      1
6:          up3   TRUE          35    Z xy28352      1

我想在 DT 中创建 26 个新列,给出每个 teamABC 等的大小。

生成的 data.table 如下所示:

> DT
   unique_point biased data_points team groupID    A   B   C ... Z
1:          up1  FALSE           3    A xy28352    3   0   0 ... 1
2:          up1   TRUE           4    A xy28352    3   0   0 ... 1
3:          up2  FALSE           1    A xy28352    3   0   0 ... 1
4:          up2   TRUE           0    X xy28352    3   0   0 ... 1
5:          up3  FALSE          12    Y xy28352    3   0   0 ... 1
6:          up3   TRUE          35    Z xy28352    3   0   0 ... 1

我不确定如何使用data.table 语法做到这一点..

编辑:我也很高兴使用 base R 和 dplyr 来做到这一点。

【问题讨论】:

  • 如何查看/使用这个输出?处理这么多稀疏列通常是一团糟。坚持使用您创建的 counts 列有什么问题?
  • @DavidArenburg 我实际上是在通过许多 data.tables 使用mclapply 来聚合一个 data.table,它将具有这些计数中的每一个。目前,当我从单个 data.tables 中使用counts 时,某些字母可能没有值(例如,在上面的示例中,C、D、E ......)。因此,我尝试为每个单独的 data.table 创建这些总和,并在 mclapply 之后将这些值传递给汇总表。有意义吗?
  • @steveb 你是对的。已编辑。

标签: r dataframe data.table melt unfold


【解决方案1】:

plyr呢,可以吗?

library(data.table)
library(plyr)

DT <- fread('unique_point biased    data_points   team   groupID                                                                                                           
            up1          FALSE     3             A      xy28352                                                                                                                 
            up1          TRUE      4             A      xy28352                                                                                                                 
            up2          FALSE     1             A      xy28352                                                                                                                  
            up2          TRUE      0             X      xy28352                                                                                                                  
            up3          FALSE     12            Y      xy28352                                                                                                                 
            up3          TRUE      35            Z      xy28352')

ldply(LETTERS, function(x){
  n <- nrow(DT[team == as.character(x),])
  DT[, as.character(x) := n]
  return(DT[team == x,])
})

> DT
   unique_point biased data_points team groupID A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
1:          up1  FALSE           3    A xy28352 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
2:          up1   TRUE           4    A xy28352 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
3:          up2  FALSE           1    A xy28352 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
4:          up2   TRUE           0    X xy28352 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
5:          up3  FALSE          12    Y xy28352 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
6:          up3   TRUE          35    Z xy28352 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1

【讨论】:

    【解决方案2】:

    这是一个不寻常的解决方案,但它有效。我用dplyrtidyr

    DT[, counts := .N, by=c("team")]
    x <- data.frame(team = sample(LETTERS,26))%>%arrange(team)
    y <- DT%>%select(team,counts)%>%unique()
    df <- x%>%left_join(y,"team")%>%spread(team, counts,fill = 0)
    cbind(DT,df)
    

    注意:left_join 确实会引发警告消息,但不会篡改输出,并且可以解决dplyr join warning: joining factors with different levels

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      相关资源
      最近更新 更多