我想找到一个变量(时间)的最小值,其他几个变量等于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))
怎么样使用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
我们可以使用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
这是你期待的吗?
library(dplyr)
df <- d %>%
group_by(cat, var1, var2) %>%
summarise(start = min(time)) %>%
filter()
我留下了一个空白的filter
参数,你可以用来指定你想要的任何过滤条件(比如说var1 == 1
或cat == "A"
)