rn=c(3,4,5,2,1,5,6,8,10,3,4,5,6,8,9,7)
na=c("A","A","A","A","A","B","B","B","B","B","CD","CD","CD","CD","CD","CD")
mo=c("ram","okd","mlu","lom","mpl","mpl","cdd","jjh","yyt","uu","tt","rre","llm","mm","mlp","lok")
dat=cbind(rn,na,mo)
我需要为na中的每个组选择rn中最小的数
示例输出:
"1" "A" "mpl"
"3" "B" "uu"
"4" "CD" "tt"
我们可以在分组后使用slice_min
(假设'dat'是data.frame
而不是matrix
) -cbind
默认返回matrix
,而不是直接使用data.frame
library(dplyr)
dat %>%
group_by(na) %>%
slice_min(n = 1, order_by = rn) %>%
ungroup
与产出
# A tibble: 3 × 3
rn na mo
<dbl> <chr> <chr>
1 1 A mpl
2 3 B uu
3 4 CD tt
数据dat <- data.frame(rn, na, mo)
base R
option:
rn=c(3,4,5,2,1,5,6,8,10,3,4,5,6,8,9,7)
na=c("A","A","A","A","A","B","B","B","B","B","CD","CD","CD","CD","CD","CD")
mo=c("ram","okd","mlu","lom","mpl","mpl","cdd","jjh","yyt","uu","tt","rre","llm","mm","mlp","lok")
dat=data.frame(rn,na,mo)
dat[dat$rn==ave(dat$rn, dat$na, FUN=min),]
#> rn na mo
#> 5 1 A mpl
#> 10 3 B uu
#> 11 4 CD tt
由reprex包(v2.0.1)创建于2022-07-06
基本R
解:
do.call(rbind,lapply(split.data.frame(dat, dat$na), function(x) x[which.min(x$rn),]))
rn na mo
A 1 A mpl
B 3 B uu
CD 4 CD tt
在创建了data.frame
filter
来做到这一点
dat=data.frame(rn,na,mo)
<<p>程序/strong>library(dplyr)
dat %>%
group_by(na) %>%
filter(rn==min(rn)) %>%
ungroup()
# A tibble: 3 x 3
rn na mo
<dbl> <chr> <chr>
1 1 A mpl
2 3 B uu
3 4 CD tt