[英]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 處比較x2
和x3
的值,如果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.