Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取满足R中groupby条件的列的第一个值?_R - Fatal编程技术网

如何获取满足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))