【问题标题】:how to compare rows in dplyr grouped data?如何比较 dplyr 分组数据中的行?
【发布时间】:2021-06-01 04:29:03
【问题描述】:

我想比较分组(按 ID 分组)数据集中的 x2 和 x3 列。我想比较第一个 1 出现在 x1 列中的行中的 x2 和 x3。如果 x2 大于 x3,我将为 ID 分配 1,否则为 0。请参见下面的示例。我的输入数据是 dt,在这个数据集中,第一次出现在 x1 列中的 1 对于 ID 100 是第 2 行并且 1410 1000,所以我将 1 分配给 ID 101。您可以在下面看到我的输出。谢谢

dt<-data.frame(ID=c(100, 100,100, 101, 101, 101), 
               x1=c(0, 1, 1, 0, 0,1), 
               x2=c(1100, 1410, 1900, 1300, 1100, 1500),
               x3=c(1400, 1510, 2900, 300, 100,1000))

ot<-data.frame(ID=c(100,101), res=c(0,1))

【问题讨论】:

  • 是1500 &lt; 1000 吗?
  • 我改变了,谢谢@AnilGoyal
  • 或者在这里,如果可行,请考虑接受解决方案。谢谢

标签: r dplyr


【解决方案1】:

你可以使用 -

library(dplyr)

dt %>%
  group_by(ID) %>%
  summarise(res = {
    tmp <- match(1, x1)
    as.integer(x2[tmp] > x3[tmp])
})

match 将返回 x1 中存在 1 的第一个索引。我们比较x2和x3在那个位置的值,如果x2 &gt; x3返回1,否则返回0。

【讨论】:

  • 晶圆厂策略。我必须学习这种隐形物体的创造。支持罗纳克 :)
【解决方案2】:

我们可以为此使用tidyverse 方法。按'ID'分组,slice 'x1' 为max 的行,然后summarise 与整数转换的关系表达式(也可以使用mutate,但summarise 默认删除最后一个组并作为只有一个组 - 我们不需要再次ungroup)

library(dplyr)
dt %>% 
    group_by(ID) %>% 
    slice(which.max(x1)) %>%
    summarise(res =  +(x2 > x3))

-输出

# A tibble: 2 x 2
#     ID   res
#  <dbl> <int>
#1   100     0
#2   101     1

或者另一种选择是按“ID”和“x1”上的逻辑表达式对行进行排序,即 x1 为 0,然后按“ID”分组,summarise 使用由 first 值构造的关系表达式“x2”和“x3”

dt %>%
   arrange(ID, !x1) %>%
   group_by(ID) %>%
   summarise(res = +(first(x2) > first(x3)))

-输出

# A tibble: 2 x 2
#     ID   res
#  <dbl> <int>
#1   100     0
#2   101     1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多