如何获取满足R中groupby条件的列的第一个值?
我有以下如何获取满足R中groupby条件的列的第一个值?,r,R,我有以下数据表 library(data.table) dt <- data.table(id_resp = c(1,1,1,1,2,2,2,2), week=c(1,2,3,4,1,2,3,4), val=c(0,0,1,1,0,0,0,2)) library(data.table) dt[dt[, .I[first(which(val > 0))], by = id_resp]$V1, ] # id_resp week val #1: 1 3 1 #
数据表
library(data.table)
dt <- data.table(id_resp = c(1,1,1,1,2,2,2,2), week=c(1,2,3,4,1,2,3,4), val=c(0,0,1,1,0,0,0,2))
library(data.table)
dt[dt[, .I[first(which(val > 0))], by = id_resp]$V1, ]
# id_resp week val
#1: 1 3 1
#2: 2 4 2
库(data.table)
对于每个id\u resp
在R中是否有一种简洁的方法可以做到这一点?我们可以在数据表中使用.I
library(data.table)
dt <- data.table(id_resp = c(1,1,1,1,2,2,2,2), week=c(1,2,3,4,1,2,3,4), val=c(0,0,1,1,0,0,0,2))
library(data.table)
dt[dt[, .I[first(which(val > 0))], by = id_resp]$V1, ]
# id_resp week val
#1: 1 3 1
#2: 2 4 2
使用dplyr
,我们可以使用类似逻辑的slice
library(dplyr)
dt %>%
group_by(id_resp) %>%
slice(first(which(val > 0)))
# id_resp week val
# <dbl> <dbl> <dbl>
#1 1 3 1
#2 2 4 2
及
使用aggregate
而不假设df
已排序:
aggregate(week ~ id_resp, data=dt[dt$val>0,], FUN=min)
# id_resp week
#1 1 3
#2 2 4
获取满足条件的列的第一个值的操作如下:
aggregate(week ~ id_resp, data=dt[dt$val>0,], FUN=function(x) {x[1]})
# id_resp week
#1 1 3
#2 2 4
我们可以使用.SD
来
dt[, .SD[which(val > 0)[1]], by = id_resp]
# id_resp week val
#1: 1 3 1
#2: 2 4 2
或使用.I
dt[dt[, .I[val > 0][1], id_resp]$V1]
# id_resp week val
#1: 1 3 1
#2: 2 4 2
如果我们只需要特定的列
dt[, .(week = week[which(val >0)[1]]), by = id_resp]
或者使用dplyr
library(dplyr)
dt %>%
group_by(id_resp) %>%
filter(val > 0, !duplicated(val))
我更喜欢这个解决方案,因为它只返回感兴趣的列
library(dplyr)
dt %>%
group_by(id_resp) %>%
filter(val > 0, !duplicated(val))