数据框修改客户出现重复的次数

时间:2019-04-29 05:18:18

标签: r dataframe

我有一张桌子,如下表

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

有没有一种方法可以对其进行修改以自定义设置我要修改的最后一行有多少重复

2 个答案:

答案 0 :(得分:2)

我们可以按“分组”分组,并用listreplace指定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