如何根据 R 中其他列的值过滤一列中的值?

How to filter for value in one column based on values from other columns in R?

这是我的数据集:

df <- data.frame(label = c(1,2,3,4,5), measurement = c(100.5, 84.7, 100.7, 77.9, 98.8), size = c(20, 19, 20, 20, 15)) 

现在我希望能够获得具有最大尺寸的标签(来自标签列)。但是,如上例所示,其中三个标签的最大值为 20。我希望我的决胜局成为测量值。所以在这种情况下,在尺寸列的三个值 20 中,测量值 100.7 是最大的。

所以我会 运行 代码,它会 return 3 有我应该使用的标签。如何跨列执行此操作?

您可以根据 sizemeasurement 列按降序 order 数据帧,然后从中提取第一个 label

df1 <- df[with(df, order(-size, -measurement)), ]
df1$label[1]
#[1] 3

或者按升序排序并提取最后一个值。使用 dplyr :

library(dplyr)

df %>%
  arrange(size, measurement) %>%
  pull(label) %>% last
#[1] 3

dplyr 中的 filter() 函数在指定为逗号分隔参数时将按顺序运行。你可以做这样的事情来过滤观察,然后 pull() 标签。

如果平局也平局,此方法会给您多个响应。

library(dplyr)

df %>% 
  filter(size == max(size), measurement == max(measurement)) %>% 
  pull(label)

在基数 R 的一行中:

df[order(df$size, df$measurement, decreasing = TRUE)[1], "label"]
# [1] 3

在这里使用 rank 可能是明智的,以解决重复问题(与 order 相比,它选择第一个最大值,dplyr::last 选择最后一个,从而省略另一个最大值)。

想想这个数据框在值列中有重复:

df
#   label measurement size
# 1     1       100.5   20
# 2     2        84.7   19
# 3     3       100.7   20  ## !
# 4     4        77.9   20
# 5     5        98.8   15
# 6     6       100.7   20  ## !

我们将添加值列的 rankrowSums 并添加“决胜局”的 rank size 最后在 maxima.

上对 levels 进行子集化
rankv <- Vectorize(rank)
R <- rankv(df[-1])  ## or `apply(df[-1], 2, rank)`
r <- rowSums(R) + rank(R[,2])
df$label[r == max(r)]
# [1] 3 6

数据:

df <- structure(list(label = c(1, 2, 3, 4, 5, 6), measurement = c(100.5, 
84.7, 100.7, 77.9, 98.8, 100.7), size = c(20, 19, 20, 20, 15, 
20)), row.names = c(NA, -6L), class = "data.frame")