【问题标题】:Using csv column names as parameter in R function在 R 函数中使用 csv 列名作为参数
【发布时间】:2014-10-16 21:49:29
【问题描述】:

我正在尝试编写一个函数,该函数将打开一些 .csv 文件并对这些数据帧的特定部分进行多次计算。我无法在函数中将列名作为参数传递,我不知道为什么。所以像这样(最小的工作示例,我的功能比这更复杂):

MyFunction <- function(file, columnname){
    data <- read.table(file,sep=",",header=TRUE);
    mean(data$columnname);
    }

我的桌面上有一个名为“test.csv”的 .csv,其中只有一个名为“数字”的列和 1:10 的数字。如果我运行其中任何一个:

MyFunction("~/Desktop/test.csv",numbers)
MyFunction("~/Desktop/test.csv","numbers")

我收到此错误:

[1] NA
Warning message:
In mean.default(data$columnname) :
   argument is not numeric or logical: returning NA

但是,如果我运行这个:

data <- read.table("~/Desktop/test.csv",sep=",",header=TRUE);
mean(data$numbers);

我明白了:

[1] 5.5

...这就是我想要的。

我不确定我的功能与在这里手动操作有何不同。我可以使用函数参数来查找并打开文件,但是在 data$parameter 中使用函数参数似乎会导致错误。为什么是这样?有什么解决方法?

【问题讨论】:

  • 您可以只使用括号索引而不是 $ 索引。例如,使用Idx &lt;- match(columnname,names(data))mean(data[,Idx]) 之类的内容获取列号。
  • 我实际上最终使用了这个,虽然两个答案都非常有帮助!

标签: r function csv


【解决方案1】:

试试这个:

MyFunction <- function(file, columnname) {
    data <- read.csv(file)
    mean(data[[columnname]])
}

注意:

b <- "a"
DF <- data.frame(a = 1, b = 2)
DF$b
## [1] 2
DF[[b]]
## [1] 1

【讨论】:

  • 太棒了,谢谢!我的问题是使用 read.table 还是 $ 或两者兼而有之?
  • $ 是问题所在。请参阅刚刚添加的说明。
最近更新 更多