dplyr мутирует несколько столбцов, используя два столбца в качестве аргументов для пользовательской функции - PullRequest
0 голосов
/ 05 июля 2018

У меня есть фрейм данных:

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 на индекс, для которого число является ближайшим, используя мою функцию (1 для A или 2 для B):

 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 Ответ

0 голосов
/ 05 июля 2018

Я немного изменил вашу функцию, чтобы векторизация работала. Он также принимал только 2 значения, когда вы пытались сравнить 1 значение с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...