R data.table按组将特定列设置为其最后的值

时间:2019-06-06 07:20:37

标签: r data.table

数据如下:

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

我想将Col1内的Col3Group设置为LAST值 例如,第1组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完成此操作?

2 个答案:

答案 0 :(得分:1)

我们可以使用tidyverse。我们按“分组”分组,然后使用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))

答案 1 :(得分:1)

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")