【问题标题】:conditionally changing contents of a columns using max() in data.table in R使用 R 中 data.table 中的 max() 有条件地更改列的内容
【发布时间】:2021-08-31 02:21:49
【问题描述】:

我有一个包含以下信息的 data.table:

   data.table(id = c(rep(1,5)),
               year = c(rep(2015,3), rep(2016,2)), 
               class = c(rep("A", 3), rep("B", 2)),
               origin = c("Europe", "Asia", "Africa", "Europe", "Asia"), 
               count = c(30299, 3, 34, 2, 800))

   id year class origin count
1:  1 2015     A Europe 30299
2:  1 2015     A   Asia     3
3:  1 2015     A Africa    34
4:  1 2016     B Europe     2
5:  1 2016     B   Asia   800

但是,每个idyearclass 只允许一个位置。这里,第一个组合有三个位置:

1:  1 2015     A Europe 30299
2:  1 2015     A   Asia     3
3:  1 2015     A Africa    34

第二个组合有两个位置:

4:  1 2016     B Europe     2
5:  1 2016     B   Asia   800

我想更改位置,这样对于每个 idyearclass 组合,将使用具有最高 count 的位置。这应该会产生一个像这样的表:

   id year class origin count
1:  1 2015     A Europe 30299
2:  1 2015     A Europe     3
3:  1 2015     A Europe    34
4:  1 2016     B   Asia     2
5:  1 2016     B   Asia   800

如何做到这一点?我正在考虑将数据表拆分为列表列表,然后应用 lapply,但我确信有更好/更简单的解决方案?有什么提示吗?

【问题讨论】:

    标签: r list data.table


    【解决方案1】:
    DT[, origin := origin[which.max(count)], by = .(id, year, class)]
    

    【讨论】:

      【解决方案2】:

      您也可以将whichdplyr 工作流一起使用。 which sindri_baldur 已经发布了解决方案(感谢他)

      library(dplyr)
      df %>% 
        group_by(id, year, class) %>% 
        mutate(origin = origin[which.max(count)])
      
      

      输出:

           id  year class origin count
        <dbl> <dbl> <chr> <chr>  <dbl>
      1     1  2015 A     Europe 30299
      2     1  2015 A     Europe     3
      3     1  2015 A     Europe    34
      4     1  2016 B     Asia       2
      5     1  2016 B     Asia     800
      

      【讨论】:

        猜你喜欢
        • 2014-04-20
        • 2021-06-05
        • 2016-04-19
        • 2014-05-04
        • 2016-03-19
        • 2015-07-28
        • 2020-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多