我有一张桌子,如下表
dat <- structure(list(id = 1:7, group = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L
), value = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), class = "data.frame", row.names = c(NA,
-7L))
id group value
1 1 1 0
2 2 1 0
3 3 1 0
4 4 2 0
5 5 2 0
6 6 2 0
7 7 3 0
8 8 3 0
例如,如果n为2,我必须在“组”列的最后n个重复项中将“值”设置为1
id | group | value
------+-------------+----------
1 | 1 | 0
2 | 1 | 1
3 | 1 | 1
4 | 2 | 0
5 | 2 | 1
6 | 2 | 1
7 | 3 | 1
8 | 3 | 1
我尝试使用此代码将最后一个副本设置为1
df['value'] <- with(df, replace(df$value, !duplicated(df$group, fromLast = TRUE), 1))
有没有一种方法可以对其进行修改以自定义设置我要修改的最后一行有多少重复
答案 0 :(得分:2)
我们可以按“分组”分组,并用list
或replace
指定tail
的“索引” row_number()
来替换值
library(dplyr)
n <- 2
df %>%
group_by(group) %>%
mutate(value = replace(value, tail(row_number(), n), 1))
# A tibble: 7 x 3
# Groups: group [3]
# id group value
# <int> <int> <dbl>
#1 1 1 0
#2 2 1 1
#3 3 1 1
#4 4 2 0
#5 5 2 1
#6 6 2 1
#7 7 3 1
或使用data.table
library(data.table)
setDT(df)[df[, tail(.I, 2), group]$V1, value := 1][]
答案 1 :(得分:2)
在基数R中,我们可以使用ave
,反转每个group
的顺序索引,并将1分配给索引小于n
的行。
n <- 2
dat$value[with(dat, ave(id, group, FUN = function(x) rev(seq_along(x)))) <= n] <- 1
dat
# id group value
#1 1 1 0
#2 2 1 1
#3 3 1 1
#4 4 2 0
#5 5 2 1
#6 6 2 1
#7 7 3 1