这是我的数据集:
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 有我应该使用的标签。如何跨列执行此操作?
答案 0 :(得分:1)
您可以根据 order
和 size
列按降序 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 ## !
我们将添加值列的 rowSums
的 rank
并添加“决胜局”的 rank
size 最后子集max
ima 上的级别。
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")