我想将向量中的重复值转换为NA,以便保留每个新值首次出现的位置。
我可以找到很多有关如何解决删除重复行的帖子,但是找不到解决该问题的帖子。
您能帮我将“问题”列转换为“需求”列中的值吗?
dplyr解决方案是首选。
library(tidyverse)
df <- tribble(
~frame, ~problem, ~desire,
1, NA, NA,
2, "A", "A",
3, NA, NA,
4, "B", "B",
5, "B", NA,
6, NA, NA,
7, "C", "C",
8, "C", NA,
9, NA, NA,
10, "E", "E")
df
# A tibble: 10 x 3
frame problem desire
<dbl> <chr> <chr>
1 1 NA NA
2 2 A A
3 3 NA NA
4 4 B B
5 5 B NA
6 6 NA NA
7 7 C C
8 8 C NA
9 9 NA NA
10 10 E E
_____ EDIT使用“ Base R” /“ dplyr”解决方案___
Ronak Shah的解决方案有效。在任何人感兴趣的情况下,它都在dplyr工作流程中:
df %>%
mutate(
solved = replace(problem, duplicated(problem), NA))
# A tibble: 10 x 4
frame problem desire solved
<dbl> <chr> <chr> <chr>
1 1 NA NA NA
2 2 A A A
3 3 NA NA NA
4 4 B B B
5 5 B NA NA
6 6 NA NA NA
7 7 C C C
8 8 C NA NA
9 9 NA NA NA
10 10 E E E
答案 0 :(得分:1)
使用data.table
rleid
,我们可以将replace
的值duplicated
变成NA
。
library(data.table)
df$answer <- replace(df$problem, duplicated(rleid(df$problem)), NA)
# frame problem desire answer
# <dbl> <chr> <chr> <chr>
# 1 1 NA NA NA
# 2 2 A A A
# 3 3 NA NA NA
# 4 4 B B B
# 5 5 B NA NA
# 6 6 NA NA NA
# 7 7 C C C
# 8 8 C NA NA
# 9 9 NA NA NA
#10 10 E E E
对于完整的基本R选项,我们可以使用rle
代替rleid
来创建序列
df$answer <- replace(df$problem, duplicated(with(rle(df$problem),
rep(seq_along(values), lengths))), NA)
如所示示例中,如果所有相似的值始终在一起,我们只能使用duplicated
df$problem <- replace(df$problem, duplicated(df$problem), NA)
答案 1 :(得分:0)
我们可以使用data.table
library(data.table)
setDT(df)[duplicated(rleid(problem)), problem := NA][]