R:使用函数dplyr :: mutate/dplyr :: transmute作用于整行

问题描述:

我有一个数据框。为了论证的缘故,我们假设它是datasets::women数据框。我想通过对每一行应用一个函数从框架创建一个向量。R:使用函数dplyr :: mutate/dplyr :: transmute作用于整行

看来,通常的方式做到这一点是使用dplyr,并呼吁mutatetransmute,例如:

dplyr::transmute(women, some_index = 2 * height + weight) 

大:工程。 但如果我拉出来的some_index计算到作用于一排功能:

calc_some_index <- function(woman) { 
    2 * woman$height + woman$weight 
} 

有没有一种方法,我应该叫mutate/transmute,使其调用其输入的每一行这个功能呢?

当然,我可以看到,我得到正确的结果,如果我叫

dplyr::transmute(women, some_index=calc_some_index(women)) 

,但我相信这仅仅是“欺骗”通过,预先计算的胶层计算向量,对transmute通话。它不起作用,例如,如果我打电话:

dplyr::transmute(head(women, n=10), some_index=calc_some_index(women)) 

我觉得你是在发生维度错误。

如果我做

library(dplyr) 
transmute(head(women, n=10), 
      some_index=calc_some_index(head(women,10))) 

然后它(在你的代码中的错误有关大小不同的抱怨)

或者,你可以使用管道和它的作品:

head(women, 10) %>% 
    transmute(calc_some_index(.)) 
+0

呀,也许这不是问题的最清晰的例证。我知道我可以在第一个位置(无论是“女性”还是“头部(女性,n = 10)”)采取任何*,并将其用作第二位职能的参数,但我不会我不想像这样重复自己,你对管道提出的建议与我想要的接近,并且我知道它是如何工作的(即''.''只代表全部的管道),但可以它会在没有管道的情况下完成吗? – Peter

+0

我认为你使用管道运算符'%>%'和调用'.'变量的函数是最好的解决方案。深入挖掘,我了解到'dplyr'提供了通过在自定义环境中使用'eval'来简化短列的引用(例如'height'而不是'foo $ height')。为了使它以我想的方式工作,在'eval'中评估的表达式需要直接参考我认为不可能的封闭环境。 – Peter