根据ID替换为0个重复变量

replace with 0 duplicate variable according to ID

我有这样一个数据框:

df
ID  job_code
1   8
1   8
1   8
2   7
2   7
2   4
3   1
3   2

如果一个人有多次相同的工作代码,我想只保留第一个并将其他替换为 0,以获得这样的数据框:

df
ID  job_code    job_code_2
1   8           8
1   8           0
1   8           0
2   7           7
2   7           0
2   4           4
3   1           1
3   2           2

我想到了使用函数 :

dataframe %>% 
  group_by(ID) %>% 
  and replace 

但我不确定如何。

预先感谢您的帮助。

使用duplicated:

df %>% 
  group_by(ID) %>% 
  mutate(job_code2 = ifelse(duplicated(job_code), 0, job_code)) %>%
  ungroup()

在 base R 中你可以使用 tapply + duplicated:

df$job_code2 <- unlist(tapply(df$job_code, df$ID, function(x) ifelse(duplicated(x), 0, x)))

第一个功能不错,就是不知道为什么有的科目用不了。对于已经存在为先前主题发布的代码的主题,它不起作用 例如,对于主题 4,当我应该得到 8

时我得到了 0

我有这个:

ID job_code job_code_2 1 8 8 1 8 0 1 8 0 2 7 7 2 7 0 2 4 4 3 1 1 3 2 2 4 8 0

而不是这个:

ID job_code job_code_2 1 8 8 1 8 0 1 8 0 2 7 7 2 7 0 2 4 4 3 1 1 3 2 2 4 8 8

library(tidyverse)
df <- data.frame(
  ID = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L),
  job_code = c(8L, 8L, 8L, 7L, 7L, 4L, 1L, 2L)
)

df %>%
  group_by(ID, job_code) %>%
  mutate(job_code2 = job_code * +(row_number() == 1)) %>%
  ungroup()
#> # A tibble: 8 x 3
#>      ID job_code job_code2
#>   <int>    <int>     <int>
#> 1     1        8         8
#> 2     1        8         0
#> 3     1        8         0
#> 4     2        7         7
#> 5     2        7         0
#> 6     2        4         4
#> 7     3        1         1
#> 8     3        2         2

reprex package (v2.0.1)

于 2022-03-23 创建

另一个可能的解决方案:

library(tidyverse)

df <- read_table("ID  job_code
1   8
1   8
1   8
2   7
2   7
2   4
3   1
3   2")

df %>% 
  group_by(ID, job_code) %>% 
  mutate(job_code = if_else(row_number() > 1, 0, job_code)) %>% 
  ungroup

#> # A tibble: 8 x 2
#>      ID job_code
#>   <dbl>    <dbl>
#> 1     1        8
#> 2     1        0
#> 3     1        0
#> 4     2        7
#> 5     2        0
#> 6     2        4
#> 7     3        1
#> 8     3        2