Передача строки в качестве аргумента функции в R dplyr mutate - PullRequest
2 голосов
/ 11 мая 2019

Я пишу программу, которая вычисляет разницу между элементом набора данных и остальными элементами. Я использую dplyr mutate и мне нужно передать всю строку в качестве аргумента функции, которая вычисляет разницу. Используя ирис в качестве примера:

#Difference function
diff_func <- function (e1, e2) {
  return(sum(e1-e2))
}

chosenElement <- iris[1,1:4] # Chosen element
elements <- iris[10:50,1:4] # Elements to compare to

elements %>% 
  rowwise() %>% 
  mutate(difference=diff_func(chosenElement, c(Petal.Width, Petal.Length, Sepal.Width, Sepal.Length)))

Это работает, но, поскольку я использую всю строку, я бы хотел использовать что-то вроде «this» или «row» вместо указания всех столбцов строки:

elements %>% 
  rowwise() %>% 
  mutate(difference=diff_func(chosenElement, row))

Кто-нибудь знает, можно ли это сделать?

Ответы [ 3 ]

2 голосов
/ 11 мая 2019

Мы можем сделать это очень легко в base R, реплицируя выбранный элемент, чтобы сделать размеры одинаковыми

elementsNew <- elements - chosenElement[col(elements)]

Обратите внимание, что mutate предназначен для изменения / преобразования значений одного столбца/ несколько столбцов -> один столбец.Конечно, мы можем поместить другие типы объектов в list.Предполагая, что «различие» должно быть для каждого столбца «элементов» с соответствующим элементом «selectedElement», mutate не делает этого с diff_func

Update

Исходя из пояснения, нам кажется, что нам нужно получить разницу между столбцами с соответствующим выбранным элементом (здесь мы реплицировались), а затем выполнить rowSums

elements %>%
        mutate(difference = rowSums(. - chosenElement[col(.)]))
1 голос
/ 11 мая 2019

A purrr base комбинация:

do.call(cbind,purrr::map2(elements,chosenElement,function(x,y) x-y))
0 голосов
/ 12 мая 2019

Поскольку (a - d) + (b - e) + (c - f) == (a + b + c) - (d + e + f), это просто разница между суммами строк elements и суммой chosenElements, которую вы можете сделать в пределах базовой R:

elements$dfrnce <- rowSums(elements) - sum(chosenElement)

Или в dplyr:

elements %>%
  mutate(dfrnce = rowSums(.) - sum(chosenElement))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...