【问题标题】:R data.table set specific columns to their last values, by groupR data.table 按组将特定列设置为其最后一个值
【发布时间】:2019-06-06 07:20:37
【问题描述】:

数据如下所示:

Col1    Col2    Col3    Group
1       1       2       1
1       1       3       1
2       2       4       1
2       3       3       2
2       3       4       2
2       4       5       2
3       4       6       2

我想在Group 内将Col1Col3 设置为它们的LAST 值 例如,Col1 Group 2 的最后一个值为 3。所以在第 2 组中,我希望 Col1 的所有值都设置为 3

预期结果:

Col1    Col2    Col3    Group
2       1       4       1
2       1       4       1
2       2       4       1
3       3       6       2
3       3       6       2
3       4       6       2
3       4       6       2

如何用 data.table 做到这一点?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以使用tidyverse。我们按“Group”分组,并使用mutate_at 选择感兴趣的变量,替换为每列的last

    library(dplyr)
    df1 %>%
      group_by(Group) %>%
      mutate_at(vars(Col1, Col3), last)
    # A tibble: 7 x 4
    # Groups:   Group [2]
    #   Col1  Col2  Col3 Group
    #  <int> <int> <int> <int>
    #1     2     1     4     1
    #2     2     1     4     1
    #3     2     2     4     1
    #4     3     3     6     2
    #5     3     3     6     2
    #6     3     4     6     2
    #7     3     4     6     2
    

    或者用data.table,用同样的逻辑,(如果不是data.table,用setDT转换成data.table),在.SDcols中指定感兴趣的列,循环遍历的子集Data.table (.SD),获取last 值并将其分配(:=) 到列

    library(data.table)
    nm1 <- c("Col1", "Col3")
    setDT(df1)[, (nm1) := lapply(.SD, last), by = Group, .SDcols = nm1]
    

    数据

    df1 <- structure(list(Col1 = c(1L, 1L, 2L, 2L, 2L, 2L, 3L), Col2 = c(1L, 
    1L, 2L, 3L, 3L, 4L, 4L), Col3 = c(2L, 3L, 4L, 3L, 4L, 5L, 6L), 
        Group = c(1L, 1L, 1L, 2L, 2L, 2L, 2L)), class = "data.frame", 
        row.names = c(NA, 
    -7L))
    

    【讨论】:

      【解决方案2】:
      library(data.table)
      
      cols <- c("Col1", "Col3")
      DT[, (cols) := .SD[.N], by = Group, .SDcols = cols][]
      #    Col1 Col2 Col3 Group
      # 1:    2    1    4     1
      # 2:    2    1    4     1
      # 3:    2    2    4     1
      # 4:    3    3    6     2
      # 5:    3    3    6     2
      # 6:    3    4    6     2
      # 7:    3    4    6     2
      

      数据

      DT <- fread("Col1    Col2    Col3    Group
      1       1       2       1
      1       1       3       1
      2       2       4       1
      2       3       3       2
      2       3       4       2
      2       4       5       2
      3       4       6       2")
      

      【讨论】:

        猜你喜欢
        • 2020-08-19
        • 2016-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-28
        • 2013-05-21
        相关资源
        最近更新 更多