数据如下:
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
内的Col3
和Group
设置为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完成此操作?
答案 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")