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