我有一个以前没见过的用例。我有以下数据框,并希望选择" y"的值。在哪里" x"对于条件的每个级别分别达到其最小值和最大值34; i"。
> library(dplyr)
> df <- data.frame(i=c(1,1,2,2),x=c(1.0,2.0,3.0,4.0),y=c('a','b','c','d'))
> ddply(df, .(i), summarise, Min=min(x), Max=max(x))
i Min Max
1 1 2
2 3 4
这是正确的,但我希望y
x
为Min
或Max
。
i Min Max
1 a b
2 c d
我该怎么做?
答案 0 :(得分:4)
我们可以使用slice
library(dplyr)
df %>%
group_by(i) %>%
slice(which.min(x)) %>%
#or
#slice(which.max(x)) %>%
select(-x)
答案 1 :(得分:3)
如果您愿意超出tidyverse
范围,则另一种选择是data.table
:
setDT(df)[, list(min = y[which.min(x)],
max = y[which.max(x)]), by = i]
# i min max
#1: 1 a b
#2: 2 c d
答案 2 :(得分:3)
library(plyr)
df <- data.frame(i=c(1,1,2,2),x=c(1.0,2.0,3.0,4.0),y=c('a','b','c','d'))
ddply(df, .(i), summarise, Min=y[which.min(x)], Max=y[which.min(x)])
答案 3 :(得分:1)
基础R的解决方案:
output <- by(df, df[, "i"], with, {
data.frame(i=i[1], min=y[which.min(x)], max=y[which.max(x)])
})
给出
> output
df[, "i"]: 1
i min max
1 1 a b
------------------------------------------------------------
df[, "i"]: 2
i min max
1 2 c d
(data.frame对于保留“y”的因子结构是必要的。我相信。)
输出可以与do.call(rbind, output)
> do.call(rbind, output)
i min max
1 1 a b
2 2 c d