我有一个数据框:
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
无论工作如何,都不必成为麻烦的解决方案! 谢谢
答案 0 :(得分:1)
为了矢量化工作,我对您的功能做了一些改动。当您要比较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