R 获取数据框中的最小值,选择2列上的行[重复]。

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

我有一个数据框,就像我在下面简化的那样。我想首先根据X列选择具有相同值的行,然后根据Y列选择具有相同值的行,然后从该选择中,我想取最小值。我现在用的是forloop,但似乎一定有更简单的方法。谢谢

set.seed(123)    
data<-data.frame(X=rep(letters[1:3], each=8),Y=rep(c(1,2)),Z=sample(1:100, 12))
data
   X Y  Z
1  a 1 76
2  a 1 22
3  a 2 32
4  a 2 23
5  b 1 14
6  b 1 40
7  b 2 39
8  b 2 35
9  c 1 15
10 c 1 13
11 c 2 21
12 c 2 42

希望得到的结果。

   X Y  Z
2  a 1 22
4  a 2 23
5  b 1 14
8  b 2 35
10 c 1 13
11 c 2 21
r dataframe select multiple-columns min
2个回答
4
投票

下面是一个 data.table 解决办法。

library(data.table)
data = data.table(data)
data[, min(Z), by=c("X", "Y")]

根据OP的评论进行编辑。

如果我们排序的列中有一个NA值,就会创建一个额外的行。

data[2,2] <-NA
data[, min(Z,na.rm = T), by=c("X", "Y")]

   X  Y V1
1: a  1 31
2: a NA 79
3: a  2 14
4: b  1 31
5: b  2 14
6: c  1 50
7: c  2 25

2
投票
library(tidyverse)
data %>%
  group_by(X, Y) %>%
  summarise(Z = min(Z))

这样就可以了 现在的另一个答案是 data.table 这是 tidyverse. 这两种方法都是极其强大的方法来处理数据清洗&操作--熟悉其中一种方法可能会有帮助!


2
投票

基础 你可以用 aggregate 取之于民 Z 由其余列分组,如。

aggregate(Z~.,data,min)
#  X Y  Z
#1 a 1 31
#2 b 1 31
#3 c 1 50
#4 a 2 14
#5 b 2 14
#6 c 2 25

如果有一个 NA 在群里。

data[2,2] <-NA

忽略它。

aggregate(Z~.,data,min)
#  X Y  Z
#1 a 1 31
#2 b 1 31
#3 c 1 50
#4 a 2 14
#5 b 2 14
#6 c 2 25

Show it:

aggregate(data$Z, list(X=data$X, Y=addNA(data$Y)), min)
#  X    Y  x
#1 a    1 31
#2 b    1 31
#3 c    1 50
#4 a    2 14
#5 b    2 14
#6 c    2 25
#7 a <NA> 79

0
投票

这段代码如果能分成多行就更好了,但它能用,在Base-R中

do.call(rbind,
lapply(unlist(lapply(split(data,data$X), function(x) split(x,x$Y)),recursive=F), function(y) y[y$Z==min(y$Z),])
)

    X Y  Z
a.1 a 1 31
a.2 a 2 14
b.1 b 1 31
b.2 b 2 14
c.1 c 1 50
c.2 c 2 25
© www.soinside.com 2019 - 2024. All rights reserved.