【问题标题】:Finding Maximumth value of currently mutating variable in dplyr在 dplyr 中查找当前变异变量的最大值
【发布时间】: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 解决方案是我发布此内容的动力!

标签: r dplyr


【解决方案1】:

一个问题是max(ID) + 1,它将给出常数值,第二个问题是ifelse 本身,它要求'是'和'否'的等长向量。在下面的解决方案中,我们将max(ID) + 1 替换为max(ID) + seq_len(sum(flag)),而不是ifelse 使用replace

df %>%
   group_by(ID) %>% 
   mutate(flag = lag(Address, default = Address[1])!= Address) %>%
   ungroup() %>% 
   mutate(newID = replace(ID, flag, max(ID) + seq_len(sum(flag))))%>% 
   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     7       B
# 8     4       C
# 9     8       D
#10     9       E
#11     5       F
#12     5       F
#13     5       F

另外,创建'flag'的两条ifelse语句可以用一条语句代替

【讨论】:

  • 太棒了!那么这部分seq_len(sum(flag)) 是否使用TRUE 来创建增量值?
  • @amrrs sum(flag) 是 4 和 seq_len(4)#[1] 1 2 3 4 所以,它会给你所需的增量
  • 没有这方面的知识,我真的有好几个小时在敲我的脑袋。谢谢!
  • 当我们在这里时,有没有办法在同一个 mutate 函数中使用当前的 mutating 变量? (对不起,如果我感到困惑;这也是我的问题)
  • @amrrs 你的意思是没有创建flag。在这种情况下,您必须至少创建 2 次“标志”,而且效率不会那么高
猜你喜欢
  • 1970-01-01
  • 2016-12-04
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多