r - 使用 data.frame 向量的名称作为函数参数的元素
问题描述
考虑这个例子:
library(tidyverse)
# function my.sum(v)
# arguments:
# v - numeric vector
# returns:
# numeric value
#
# accepts the vector as single argument,
# returns sum of the vector elements.
my.sum <- function (v) {
return(sum(v))
}
# function my.inverse(val)
# arguments:
# val - numeric value
# returns:
# numeric value
#
# changes sign of the argument and returns it
my.inverse <- function (val) {
return(- val)
}
data.frame(x = rnorm(10, mean = 0, sd = 1),
y = rnorm(10, mean = 5, sd = 3)) %>%
mutate(my_sum = my.sum(c(x,y)),
my_inverse = my.inverse(x))
执行结果是:
x y my_sum my_inverse
1 -1.3299817 3.359306 49.23083 1.3299817
2 1.3657651 4.636359 49.23083 -1.3657651
3 -0.2122119 1.760494 49.23083 0.2122119
4 0.7002765 7.396804 49.23083 -0.7002765
5 -0.5828975 4.811493 49.23083 0.5828975
6 1.1202625 4.294421 49.23083 -1.1202625
7 1.2512032 4.907165 49.23083 -1.2512032
8 0.9228939 5.215929 49.23083 -0.9228939
9 0.1800447 0.666941 49.23083 -0.1800447
10 -0.8906996 9.657261 49.23083 0.8906996
可以看到,作为my_inverse
函数返回my.inverse(val)
的 column 正在从 column 获取值x
,执行否定并按预期写入结果。
my_sum
作为函数返回的columnmy.sum(v)
包含每一行中的常量。该常数是两个整向量 和 的连接元素之x
和y
:
sum(c(x, y))
我希望,指令my.sum()
内部的函数mutate()
将接收单行x
和y
值并将它们加入c(x, y)
,但正如我所见,它的c()
行为就像一个闭包。
如何避免这种 R 行为?
解决方案
使用此替代方法:
set.seed(505)
dat <-data.frame(x = rnorm(10, mean = 0, sd = 1),
y = rnorm(10, mean = 5, sd = 3),
z = rnorm(10, mean = 10, sd = 3))
my.sum <- function (df, variables) {
return(rowSums(df[, variables]))
}
dat %>%
mutate(my_sum = my.sum(., c("x","y")))
# x y z my_sum
# 1 -1.1211894 -1.620691 3.800424 -2.741880
# 2 -1.2820570 4.263010 8.831353 2.980953
# 3 -2.0393425 3.563943 13.118901 1.524600
# 4 -0.9377324 4.397400 11.522940 3.459667
# 5 -0.5101607 6.440323 12.993764 5.930162
# 6 -0.4128447 6.071003 11.765313 5.658158
# 7 -0.9103679 6.300995 8.811942 5.390627
# 8 0.1407611 9.089672 10.621450 9.230433
# 9 0.5647174 7.472852 10.407413 8.037570
# 10 -0.4322744 2.479842 14.400691 2.047568
推荐阅读
- asp.net - 未发布的连接服务
- dataframe - 使用 DataFrames.jl 时通过与以前的行进行比较来过滤/选择行?
- javascript - SQLAlchemy 表中的相关下拉菜单
- python - 查看从开始到现在向 MySQL 添加了多少行(甚至删除了行)
- python - For循环计算数学表达式
- laravel - scout-elasticsearch:找不到驱动程序错误
- c - PlaySound() 函数以不一致的延迟播放声音
- apache-superset - 在超集上设置启用代理属性
- kotlin - 如何抑制 Intellij 中选定代码的重新格式化?
- docker - AWS 部署在 Elastic Beanstalk docker 类型环境中的多容器部署失败