按组查找多个变量的最小值

问题描述 投票:0回答:3

我想找到一个变量(时间)的最小值,其他几个变量等于1(或任何其他值)。基本上我的应用程序是找到x == 1的第一年,对于几个x。我知道如何为一个x找到这个,但是想避免生成多个缩小的最小数据帧,然后将它们合并在一起。有没有一种有效的方法来做到这一点?这是我的一个变量的示例数据和解决方案。

d <- data.frame(cat = c(rep("A",10), rep("B",10)),
                time = c(1:10),
                var1 = c(0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1),
                var2 = c(0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1))

ddply(d[d$var1==1,], .(cat), summarise,
      start= min(time))
r plyr
3个回答
2
投票

怎么样使用dplyr

d %>% 
   group_by(cat) %>% 
   summarise_at(vars(contains("var")), funs(time[which(. == 1)[1]]))

这使

# A tibble: 2 x 3
#   cat    var1  var2
#   <fct> <int> <int>
# 1 A         4     5
# 2 B         7     8

2
投票

我们可以使用base R在'var'的所有列中获得最小'时间',按'cat'分组

sapply(split(d[-1], d$cat), function(x)
            x$time[min(which(x[-1] ==1, arr.ind = TRUE)[, 1])])
#A B 
#4 7 

1
投票

这是你期待的吗?

library(dplyr)
df <- d %>% 
group_by(cat, var1, var2) %>% 
summarise(start = min(time)) %>% 
filter()

我留下了一个空白的filter参数,你可以用来指定你想要的任何过滤条件(比如说var1 == 1cat == "A"

© www.soinside.com 2019 - 2024. All rights reserved.