R:将dplyr::mutate/dplyr::transmute与作用于整行的函数一起使用

R:将dplyr::mutate/dplyr::transmute与作用于整行的函数一起使用,r,dplyr,R,Dplyr,我有一个数据框。为了便于讨论,让我们假设它是datasets::women数据帧。我想通过对每一行应用一个函数,从帧中创建一个向量 通常的方法似乎是使用dplyr并调用mutate或transmute,例如: dplyr::transmute(women, some_index = 2 * height + weight) 太好了,行了。 但是如果我把某个索引的计算拉到一个作用于一行的函数中,会怎么样呢 calc_some_index <- function(woman) { 2

我有一个数据框。为了便于讨论,让我们假设它是
datasets::women
数据帧。我想通过对每一行应用一个函数,从帧中创建一个向量

通常的方法似乎是使用
dplyr
并调用
mutate
transmute
,例如:

dplyr::transmute(women, some_index = 2 * height + weight)
太好了,行了。 但是如果我把
某个索引的计算拉到一个作用于一行的函数中,会怎么样呢

calc_some_index <- function(woman) {
    2 * woman$height + woman$weight
}
但我相信这只是“欺骗”,将预先计算的计算向量分为
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(.))

是的,也许这不是问题的最清楚的说明。我知道我可以拿第一个位置的任何东西(无论是
women
还是
head(women,n=10)
,然后用它作为第二个位置函数的参数,但我不想这样重复我自己。你对管道的建议接近我想要的,我知道它是如何工作的(即,
仅表示导入的完整帧),但是没有管道可以做到吗?我认为您建议使用管道操作符
%%>%%
并调用
变量上的函数是最好的解决方案。深入挖掘后,我了解到
dplyr
提供了短格式列引用(例如
height
而不是
foo$height
)通过在自定义环境中使用
eval
。要使其按我的想法工作,在
eval
中计算的表达式需要直接引用其封闭环境,我认为这是不可能的。
head(women, 10) %>%
   transmute(calc_some_index(.))