r - dplyr 使用两列作为自定义函数的参数来改变多列
问题描述
我有一个数据框:
df <- data.frame(A=c(10, 20, 30, 20),
B=c(0, 10, 20, 10),
C=c(11, 22, 21, 12),
D=c(13, 11, 33, 15))
A B C D
10 0 11 13
20 10 22 11
30 20 21 33
20 10 12 15
和一个函数来获取最接近感兴趣数字的一对数字的索引:
comp <- function(x, y) {
# x = number of interest, y = vector of 2 numbers for comparison)
ind <- which(abs(y-x)==min(abs(y-x)))
if (length(ind)==2) {
ind <- 3
}
return(ind)
}
(if 语句用于当数字在两个数字中间时,例如 15 与 10 和 20 相比)。
我想使用我的函数将 C 和 D 列更改为数字最接近的索引(A 为 1,B 为 2):
A B C D
10 0 1 1
20 10 1 2
30 20 2 1
20 10 2 3
我不确定如何在 A 列和 B 列中调用函数的参数。我试过mutate_at(df, 3:4, funs(comp), c(df$A, df$B))
了,但返回:
A B C D
10 0 3 6
20 10 3 6
30 20 3 6
20 10 3 6
不一定是一个整洁的解决方案,无论什么工作!谢谢
解决方案
为了使矢量化起作用,我对您的功能进行了一些更改。当您希望将 1 个值与其他 2 个值进行比较时,它也只接受 2 个值,因此需要 3 个参数:
comp <- function(val, x, y){
case_when(
abs(val - x) < abs(val - y) ~ 1,
abs(val - x) > abs(val - y) ~ 2,
TRUE ~ 3)
}
df %>%
mutate_at(vars(C,D), comp , .$A, .$B)
A B C D
1 10 0 1 1
2 20 10 1 2
3 30 20 2 1
4 20 10 2 3
推荐阅读
- html - 具有混合文本结构的垂直未对齐 CSS 列
- c# - Azure Functions Blob 触发器不处理所有 Blob
- groovy - 使用 groovy 将 tinestamp 附加到文件名
- android - 反混淆设置 Android
- python - 将名称为字符串的 Zip 文件从一个目录复制到另一个目录
- php - reactjs中的反序列化/反序列化对象
- android - 在 Android Studio 中运行项目的问题
- go - 导入 cgo 时 init() 函数未运行,导入“C”
- vulkan - 如何,何时从 Vulkan 中的帧缓冲区捕获图像到文件
- python - Websockets在握手后立即关闭连接