在dplyr管道中替换重复元素

3

我希望能够替换组内重复的元素。

df <- data.frame(A=c("a", "a", "a", "b", "b", "c"), group = c(1, 1, 2, 2, 2, 3))

我想保留一组中的第一个元素,同时将其他元素替换为NA。类似于以下操作:
df <- df %>% 
     group_by(group) %>%
     mutate(B = first(A))

这段代码并不能满足我的要求。我要实现的是 B <- c(a, NA, a, NA, NA, c)



你打算将 A 保留为一个因子吗?如果你这样做的话,答案会稍微改变。 (我通常使用 stringsAsFactors=FALSE,所以当我看到使用因子时,我倾向于要求澄清。) - r2evans
2个回答

6
使用replace替换duplicated:
df %>% group_by(group) %>% mutate(B = replace(A, duplicated(A), NA))

# A tibble: 6 x 2
# Groups:   group [3]
#       A group
#  <fctr> <dbl>
#1      a     1
#2     NA     1
#3      a     2
#4      b     2
#5     NA     2
#6      c     3

或者只保留第一个元素:

df %>% 
    group_by(group) %>% 
    mutate(B = ifelse(row_number() == 1, as.character(A), NA))

# A tibble: 6 x 2
# Groups:   group [3]
#      A group
#  <chr> <dbl>
#1     a     1
#2  <NA>     1
#3     a     2
#4  <NA>     2
#5  <NA>     2
#6     c     3

或者使用replace

df %>% 
    group_by(group) %>% 
    mutate(B = replace(A, row_number() > 1, NA))

# A tibble: 6 x 2
# Groups:   group [3]
#       A group
#  <fctr> <dbl>
#1      a     1
#2     NA     1
#3      a     2
#4     NA     2
#5     NA     2
#6      c     3

1
但这不是原帖作者所期望的。 - r2evans
@r2evans 我正在看他的陈述。在组内替换重复元素。但是,确切地说,OP想要什么还不确定。 - Psidom
我自己来更正一下...它并不是原帖所展示的向量,无论它是否符合期望。请求的东西和所需的东西并不总是一样的。 :-) - r2evans
@r2evans 是的。我已经修改了答案以应对因子数据类型。 - Psidom
我认为我更喜欢replace,因为它会传递factor和其级别,而不是假设和/或强制转换。但这主要是我投射自己的风格,如果可以避免,我更喜欢不假设和/或强制转换类型。 - r2evans
@r2evans 我也这么认为。在答案中添加了“replace”选项。 - Psidom

1
在 `data.table` 中,您可以这样做:

library(data.table)
setDT(df)[, B := c(A[1], rep(NA, .N - 1)), by = group]

相同的逻辑在中:

library(dplyr)
df %>% group_by(group) %>% mutate(B = c(as.character(A[1]), rep(NA, n() - 1)))

# A tibble: 6 x 3
# Groups:   group [3]
#       A group     B
#  <fctr> <dbl> <chr>
#1      a     1     a
#2      a     1  <NA>
#3      a     2     a
#4      b     2  <NA>
#5      b     2  <NA>
#6      c     3     c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接