【问题标题】:Replace duplicate elements in dplyr pipe替换 dplyr 管道中的重复元素
【发布时间】:2018-07-18 03:59:56
【问题描述】:

我想替换组内的重复元素

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 &lt;- c(a, NA, a, NA, NA, c)

【问题讨论】:

  • 您是否打算将A 保留为factor?如果你这样做,它会稍微改变答案。 (我通常使用stringsAsFactors=FALSE,所以当我看到使用的因素时,我倾向于要求澄清。)

标签: r dplyr na


【解决方案1】:

replaceduplicated 一起使用:

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

【讨论】:

  • 但这不是 OP 所期望的。
  • @r2evans 我在看他的声明。 替换组内的重复元素。但是,是的,不确定 OP 到底想要什么。
  • 我会更正自己......它不是 OP 所显示的向量,无论它是否是所需的。所要求的和需要的并不总是相同的。 :-)
  • @r2evans 是的。我已经修改了答案以应对因子数据类型。
  • 我想我更喜欢replace,因为它转移了factor 和水平而不是假设和/或强制。但这主要是我在展示自己的风格,如果可以避免的话,我宁愿不假设和/或强制类型。
【解决方案2】:

data.table 你可以这样做:

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

或者dplyr中的相同逻辑:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-10
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    相关资源
    最近更新 更多