我有以下数据集:crab_traps <- tibble(trap_id = 1:5, logger_1 = c(2, 3, 4, 5, 6), logger_2 = c(9, 7, 5, 3, 1), logger_3 = c(6, 5, 1, 7, 8)
trap_id
标识一个特定的捕蟹器,每logger_*
列是到水质记录器的距离。
我想创建一个新列(最好使用dplyr::mutate
)来确定哪个记录器最接近每个陷阱。
希望新列类似于我尝试过的closest_logger <- c("logger_1", "logger_1", "logger_3", "logger_2", "logger_2")
(使用此示例数据),它给了我最小的测量值,但我想获得最小测量值来自的列的名称。任何帮助都会很棒!crab_traps <- crab_traps %>% rowwise() %>% mutate(closest_logger = min(logger_1, logger_2, logger_3))
问问题
35 次
1 回答
0
最有效的解决方案是使用max.col
:
crab_traps$closest_logger <- names(crab_traps)[max.col(-crab_traps[-1]) + 1]
如果您想要一个dplyr
解决方案,您可以尝试c_across
使用rowwise
.
library(dplyr)
crab_traps %>%
rowwise() %>%
mutate(closest_logger = names(.)[which.min(c_across(starts_with('logger')))+1])
# trap_id logger_1 logger_2 logger_3 closest_logger
# <int> <dbl> <dbl> <dbl> <chr>
#1 1 2 9 6 logger_1
#2 2 3 7 5 logger_1
#3 3 4 5 1 logger_3
#4 4 5 3 7 logger_2
#5 5 6 1 8 logger_2
在这两种情况下,我们添加+1
是因为我们在计算最小值时忽略了第一列。
于 2020-07-22T06:50:25.407 回答