簡體   English   中英

如何比較 dplyr 分組數據中的行?

[英]how to compare rows in dplyr grouped data?

我想比較分組(按 ID 分組)數據集中的 x2 和 x3 列。 我想比較第一個 1 出現在 x1 列中的行中的 x2 和 x3。 如果 x2 大於 x3,我將為 ID 分配 1,否則為 0。請參見下面的示例。 我的輸入數據是 dt,在這個數據集中,第一次出現在 x1 列中的 1 對於 ID 100 是第 2 行和 1410 < 1510,所以我將 0 分配給 ID 100。首先在 x1 列中出現 1 對於 ID 101是第 6 行,可以看到 1500 > 1000,所以我將 1 分配給 ID 101。您可以在下面看到我的 output。 謝謝

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))

您可以使用 -

library(dplyr)

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

match將返回x1中存在 1 的第一個索引。 我們在 position 處比較x2x3的值,如果x2 > x3則返回 1,否則返回 0。

為此,我們可以使用tidyverse方法。 按“ID”分組,對“x1”為max的行進行slice ,然后使用 integer 轉換的關系表達式進行summarise (也可以使用mutate ,但summarise默認情況下會刪除最后一組,因為只有一個組 - 我們不這樣做' t需要再次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”分組,用由“x2”和“x3”的first值構造的關系表達式進行summarise

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM