将行作为参数传递给R dplyr mutate中的函数

时间:2019-05-11 17:15:50

标签: r dplyr mutate

我正在编写一个程序,该程序计算数据集元素与其余元素之间的差异。我正在使用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 个答案:

答案 0 :(得分:2)

我们可以在base R中非常容易地做到这一点,方法是复制selectedElement以使尺寸相同

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

请注意,mutate用于更改/转换单列/多列->单列的值。当然,我们可以将其他类型的对象放在list中。假设“元素”的每一列都应与“ chosenElement”的对应元素相区别,mutate不会与diff_func

做到这一点

更新

根据说明,似乎我们需要获取具有对应的selectedElement的列之间的差异(此处已复制),然后执行rowSums

elements %>%
        mutate(difference = rowSums(. - chosenElement[col(.)]))

答案 1 :(得分:1)

purrr base组合:

do.call(cbind,purrr::map2(elements,chosenElement,function(x,y) x-y))

答案 2 :(得分:0)

(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))