R dplyr 按行获取 which.min 的名称
R dplyr get name of which.min rowwise
我刚刚用 data.table
方法回答了 ,并且正在努力提供一个 dplyr
等价物,但失败得很惨。
有一个简单的数据框,其列中包含数值。我想使用 dplyr.
获取具有最小值 的列的名称
请注意,我知道解决此问题的其他方法:目前我唯一感兴趣的是 dplyr 方法
id <- c(1,2,3,4,5,6,7,8,9,10)
x1 <- c(2,4,5,3,6,4,3,6,7,7)
x2 <- c(0,1,2,6,7,6,0,8,2,2)
x3 <- c(5,3,4,5,8,3,4,2,5,6)
DF <- data.frame(id, x1,x2,x3)
我尝试了几种变体:
DF %>% select(2:4) %>% rowwise() %>% mutate(y = function(x) names(x)[which.min(x)])
DF %>% select(2:4) %>% rowwise() %>% mutate(y = apply(x1:x3, 1, which.min(x1:x3))
但还没有找到以 dplyr
方式执行此操作的方法。我会很感激任何提示!
预期输出:
DF
## id x1 x2 x3 y
## 1: 1 2 0 5 x2
## 2: 2 4 1 3 x2
## 3: 3 5 2 4 x2
## 4: 4 3 6 5 x1
## 5: 5 6 7 8 x1
## 6: 6 4 6 3 x3
## 7: 7 3 0 4 x2
## 8: 8 6 8 2 x3
## 9: 9 7 2 5 x2
## 10: 10 7 2 6 x2
这看起来有点(嗯,实际上非常)笨重但是...
DF %>%
mutate(y = apply(.[,2:4], 1, function(x) names(x)[which.min(x)]))
id x1 x2 x3 y
1 1 2 0 5 x2
2 2 4 1 3 x2
3 3 5 2 4 x2
4 4 3 6 5 x1
5 5 6 7 8 x1
6 6 4 6 3 x3
7 7 3 0 4 x2
8 8 6 8 2 x3
9 9 7 2 5 x2
10 10 7 2 6 x2
这是另一种方法.. 我没有 运行 任何基准测试,但我猜它会比使用 apply
或 rowwise
.
表现更好
DF %>%
mutate(y = names(.)[max.col(.[2:4]*-1)+1L])
# id x1 x2 x3 y
# 1 1 2 0 5 x2
# 2 2 4 1 3 x2
# 3 3 5 2 4 x2
# 4 4 3 6 5 x1
# 5 5 6 7 8 x1
# 6 6 4 6 3 x3
# 7 7 3 0 4 x2
# 8 8 6 8 2 x3
# 9 9 7 2 5 x2
# 10 10 7 2 6 x2
*-1
是因为我们想要最小列而不是最大列,而 +1 是因为我们只查看列 2:4 但需要 return 中的正确列名。
我刚刚用 data.table
方法回答了 dplyr
等价物,但失败得很惨。
有一个简单的数据框,其列中包含数值。我想使用 dplyr.
获取具有最小值 的列的名称请注意,我知道解决此问题的其他方法:目前我唯一感兴趣的是 dplyr 方法
id <- c(1,2,3,4,5,6,7,8,9,10)
x1 <- c(2,4,5,3,6,4,3,6,7,7)
x2 <- c(0,1,2,6,7,6,0,8,2,2)
x3 <- c(5,3,4,5,8,3,4,2,5,6)
DF <- data.frame(id, x1,x2,x3)
我尝试了几种变体:
DF %>% select(2:4) %>% rowwise() %>% mutate(y = function(x) names(x)[which.min(x)])
DF %>% select(2:4) %>% rowwise() %>% mutate(y = apply(x1:x3, 1, which.min(x1:x3))
但还没有找到以 dplyr
方式执行此操作的方法。我会很感激任何提示!
预期输出:
DF
## id x1 x2 x3 y
## 1: 1 2 0 5 x2
## 2: 2 4 1 3 x2
## 3: 3 5 2 4 x2
## 4: 4 3 6 5 x1
## 5: 5 6 7 8 x1
## 6: 6 4 6 3 x3
## 7: 7 3 0 4 x2
## 8: 8 6 8 2 x3
## 9: 9 7 2 5 x2
## 10: 10 7 2 6 x2
这看起来有点(嗯,实际上非常)笨重但是...
DF %>%
mutate(y = apply(.[,2:4], 1, function(x) names(x)[which.min(x)]))
id x1 x2 x3 y 1 1 2 0 5 x2 2 2 4 1 3 x2 3 3 5 2 4 x2 4 4 3 6 5 x1 5 5 6 7 8 x1 6 6 4 6 3 x3 7 7 3 0 4 x2 8 8 6 8 2 x3 9 9 7 2 5 x2 10 10 7 2 6 x2
这是另一种方法.. 我没有 运行 任何基准测试,但我猜它会比使用 apply
或 rowwise
.
DF %>%
mutate(y = names(.)[max.col(.[2:4]*-1)+1L])
# id x1 x2 x3 y
# 1 1 2 0 5 x2
# 2 2 4 1 3 x2
# 3 3 5 2 4 x2
# 4 4 3 6 5 x1
# 5 5 6 7 8 x1
# 6 6 4 6 3 x3
# 7 7 3 0 4 x2
# 8 8 6 8 2 x3
# 9 9 7 2 5 x2
# 10 10 7 2 6 x2
*-1
是因为我们想要最小列而不是最大列,而 +1 是因为我们只查看列 2:4 但需要 return 中的正确列名。