我有data.frame
这种结构:
id time var1 var2 var3
1 2 4 5 6
1 4 8 51 7
1 1 9 17 38
2 12 8 9 21
2 15 25 6 23
对于所有ID,我想要包含最短时间的行。在这个例子中是这样的:
id time var1 var2 var3
1 1 9 17 38
2 12 8 9 21
我认为aggregate
函数会有用,但我不确定如何使用它。
答案 0 :(得分:1)
您的标题可能会产生误导,因为您确实希望每行time
保留最低id
行。试试这个:
library(dplyr)
df %>%
group_by(id) %>%
arrange(id, time) %>%
filter(row_number() == 1)
答案 1 :(得分:1)
我们可以使用by
,do.call
以及功能齐全的which.min
函数来获取所需内容:
do.call('rbind', by(df, df$id, function(x) x[which.min(x$time), ]))
# id time var1 var2 var3
# 1 1 1 9 17 38
# 2 2 12 8 9 21
如果您怀疑每个ID可能有多个最小值,则可以避开which.min
函数并使用which(x$time == min(x$time))
:
do.call('rbind', by(df, df$id, function(x) x[which(x$time == min(x$time)), ]))
# id time var1 var2 var3
# 1 1 1 9 17 38
# 2 2 12 8 9 21
df <- structure(list(id = c(1L, 1L, 1L, 2L, 2L),
time = c(2L, 4L, 1L, 2L, 15L),
var1 = c(4L, 8L, 9L, 8L, 25L),
var2 = c(5L, 51L, 17L, 9L, 6L),
var3 = c(6L, 7L, 38L, 21L, 23L)),
.Names = c("id", "time", "var1", "var2", "var3"),
class = "data.frame", row.names = c(NA, -5L))
答案 2 :(得分:1)
slice
library(dplyr)
df %>%
group_by(id) %>%
slice(which.min(time))
输出:
Source: local data frame [2 x 5]
Groups: id [2]
id time var1 var2 var3
<dbl> <dbl> <dbl> <dbl> <int>
1 1 1 9 17 38
2 2 12 8 9 21
library(sqldf)
sqldf('SELECT id, MIN(time) time, var1, var2, var3
FROM df
GROUP BY id')
输出:
id time var1 var2 var3
1 1 1 9 17 38
2 2 12 8 9 21