0

我有以下数据集:
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))

4

1 回答 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 回答