我在理解R如何处理内部子集时遇到了一些麻烦,这导致我在尝试构建一些函数时出现了一些问题。以以下代码为例:
f <- function(directory, variable, number_seq) {
##Create a empty data frame
new_frame <- data.frame()
## Add every data frame in the directory whose name is in the number_seq to new_frame
## the file variable specify the path to the file
for (i in number_seq){
file <- paste("~/", directory, "/",sprintf("%03d", i), ".csv", sep = "")
x <- read.csv(file)
new_frame <- rbind.data.frame(new_frame, x)
}
## calculate and return the mean
mean(new_frame[, variable], na.rm = TRUE)*
}
*在计算平均值时,我尝试先使用$
符号new_frame$variable
和子集函数subset( new_frame, select = variable
进行子集,但它只会返回一个None值。它只在我使用new_frame[, variable]
时起作用。
谁能解释为什么其他子集不起作用?我花了很长时间才弄明白,尽管我设法使它工作,但我仍然不知道为什么它不能以其他方式工作,我真的想看看黑盒子的内部,这样我以后就不会有同样的问题了。
谢谢你的帮助
这种行为与您在函数内部进行子集的事实有关。
new_frame$variable
和subset(new_frame, select = variable)
都在数据框中查找名为variable
的列。
另一方面,使用new_frame[, variable]
使用f(directory, variable, number_seq)
中的变量名来选择列
美元符号($
)只能用于文字列名。避免与
dd<-data.frame(
id=1:4,
var=rnorm(4),
value=runif(4)
)
var <- "value"
dd$var
在这种情况下,如果$
使用变量名或列名,您期望哪一个?dd$var
列或dd$value
列(因为var == "value"
)。这就是为什么dd[, var]
方式是不同的,因为它只接受字符向量,而不是引用列名的表达式。您将获得dd$value
与dd[, var]
我不太确定为什么你有None
和subset()
,我无法复制这个问题。