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

时间:2021-01-08 13:45:36

标签: r dataframe sorting filter multiple-columns

这是我的数据集:

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。我希望我的决胜局成为测量值。因此,在这种情况下,在 size 列的三个 20 值中,100.7 的测量值最大。

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

4 个答案:

答案 0 :(得分:1)

您可以根据 ordersize 列按降序 measurement 数据框,然后从中提取第一个 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

答案 1 :(得分:1)

filter() 中的 dplyr 函数在指定为逗号分隔参数时将按顺序运行。您可以执行类似操作以过滤到观察结果,然后pull() 标签。

如果决胜局也打平,这个方法会给你多个回复。

library(dplyr)

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

答案 2 :(得分:1)

在基数 R 中的一行:

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

答案 3 :(得分:0)

在这里使用 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  ## !

我们将添加值列的 rowSumsrank 并添加“决胜局”的 rank size 最后子集maxima 上的级别

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")