【发布时间】:2017-10-30 19:45:02
【问题描述】:
在尝试解决这个问题时Identify duplicates of one value with different values in another column;我觉得解决方案更接近,但我不能,因为当我在下面的代码中使用 max(ID) 而不是后突变值(如递归)时,dplyr mutate 函数指的是预突变状态的 max。
目标是为当前地址与相同 ID 值的先前地址不匹配的行分配一个新的唯一 ID 值。
我试过的代码:
df <- read.table(text = 'ID Address
1 X
1 X
1 Y
2 Z
2 Z
3 A
3 B
4 C
4 D
4 E
5 F
5 F
5 F
', header= T, stringsAsFactors = F)
df %>% group_by(ID) %>% mutate(flag = ifelse(lag(Address)==Address,F,T)) %>%
mutate(flag = ifelse(is.na(flag),F,flag)) %>% ungroup() %>%
mutate(newID = ifelse(flag | is.na(flag), max(ID)+1,ID))%>%
select(ID = newID,Address)
收到的输出:
# A tibble: 13 x 2
ID Address
<dbl> <chr>
1 1 X
2 1 X
3 6 Y
4 2 Z
5 2 Z
6 3 A
7 6 B
8 4 C
9 6 D
10 6 E
11 5 F
12 5 F
13 5 F
预期输出:
ID Address
1 X
1 X
6 Y
2 Z
2 Z
3 A
7 B
4 C
8 D
9 E
5 F
5 F
5 F
任何帮助将不胜感激!
编辑:
理想代码:我应该可以使用newID,这是当前要使用的变异变量。
> df %>% group_by(ID) %>% mutate(flag = ifelse(lag(Address)==Address,F,T)) %>%
+ mutate(flag = ifelse(is.na(flag),F,flag)) %>% ungroup() %>%
+ mutate(newID = ifelse(flag | is.na(flag), max(newID)+1,ID))%>%
+ select(ID = newID,Address)
【问题讨论】:
-
我不明白你的问题,你的预期输出是@akrun 我在链接帖子中给你的
-
我更新了代码,使其达到理想状态。有帮助吗?
-
不是真的,我无法理解你的帖子,但@akrun 显然可以,所以你不需要我 ;)。
-
抱歉,但具有讽刺意味的是,您的
tidyr解决方案是我发布此内容的动力!