根据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
我有这样一个数据框:
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