问题描述
我对另一个问题有疑问,但我尝试将其分解为更简单的代码,以便可以看到我的最初问题。我尝试制作一个数据框和一个计算总和的函数,如下所示:
df <- data.frame(x=c(1,2,3),y=c(1,3))
fun <- function(data,x,y){
z <- sum(data$x) + sum(data$y)
return(z)
}
fun(data= df,x = df$x,y = df$y)
[1] 12
代码为我提供了预期的总和。12。将df数据帧的列名更改为例如“ r”和“ t” 即使我在函数中指定参数也返回0。怎么了?
df <- data.frame(r=c(1,t=c(1,3))
fun <- function(data,y){
z <- sum(data$x) + sum(data$y)
return(z)
}
fun(data= df,x = df$r,y = df$t)
[1] 0
谢谢。
解决方法
问题是第二个函数试图从x
中提取变量y
和data
。这等效于执行data[["x"]]
,这不是您的意图。
相反,我们可以将变量作为字符传递,以获得预期的结果并将提取的内容从data$x
转换为data[[x]]
:
df <- data.frame(r=c(1,2,3),t=c(1,3))
fun <- function(data,x,y){
z <- sum(data[[x]]) + sum(data[[y]])
return(z)
}
fun(data= df,x = "r",y = "t")
#> [1] 12
对于此特定示例,我们可以使用基本方法并使用非常干净的with()
:
with(df,sum(r) + sum(t))
,
我建议采用下一种方法。使用$
查找数据帧时,您的代码看起来像。相反,您可以尝试以下方法:
#Data 1
df <- data.frame(x=c(1,y=c(1,3))
#Function
fun <- function(data,y){
z <- sum(x) + sum(y)
return(z)
}
#Apply
fun(data= df,x = df$x,y = df$y)
输出:
[1] 12
现在是第二个示例:
#Apply 2
df <- data.frame(r=c(1,3))
fun(data= df,x = df$r,y = df$t)
输出:
[1] 12