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