【问题标题】:dplyr with row_number, ifelse and mutate具有 row_number、ifelse 和 mutate 的 dplyr
【发布时间】:2021-06-29 12:41:28
【问题描述】:

我正在尝试使用以下语法使用 dplyr

Group_by(PersonID) %>% 
  mutate(event_number = ifelse(row_number()==2 & x > y, 1, 2)

我正在对这样的数据运行此命令并尝试获取偶数列中所示的输出

PersonID, X, Y , event_number
1,        5, 9, 1
1,        8, 5, 1
2,        3, 3, 1
2,        5, 9, 2

由于某些超出我的原因,event_number 显示为 2 表示所有内容。

任何帮助将不胜感激。

【问题讨论】:

  • 如果没有看到您的数据,我们很难为您提供帮助。你能展示你的数据的一个小样本吗?就像 5 行,只有运行您的代码行所需的列。
  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example
  • 这意味着对于第 2 行,您的 x<= y,因此您的条件对于每一行都是错误的。
  • 我添加了虚拟数据以尝试更好地说明 - 感谢您的建议
  • 为什么输出会是 1, 1, 1 和 2 ?例如 - 第一行应该是 2,因为行号是 1。

标签: r dplyr


【解决方案1】:

按照您的示例,尚不清楚您的问题是什么。如果我根据上述数据创建一个数据框:

library(dplyr)



df <- data.frame("PersonID" = c(1,1,2,2),
                   "X" = c(5,8,3,5),
                   "Y" = c(9,5,3,9))

我明白了:

print(df)

  PersonID X Y
1        1 5 9
2        1 8 5
3        2 3 3
4        2 5 9

运行上述 dplyr 代码会产生以下输出:

df %>% group_by(PersonID) %>% 
  mutate(event_number = ifelse(row_number()==2 & X > Y, 1, 2))


# A tibble: 4 x 4
# Groups:   PersonID [2]
  PersonID     X     Y event_number
     <dbl> <dbl> <dbl>        <dbl>
1        1     5     9            2
2        1     8     5            1
3        2     3     3            2
4        2     5     9            2

考虑到您的条件,这非常有意义。如果行号等于 2 并且 X 大于 Y,那么你得到 1,否则你得到 2。

注意ifelse(逻辑条件,如果为TRUE则输出,如果为FALSE则输出)

因此,在此示例数据中,条件 row number = 2 在第 2 行中仅满足一次。这已经意味着所有其他行都将返回 2。如果在您的原始数据中 X

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多