R语言学习笔记 —— 函数的使用

Coursera R Programming —— function(args1, args2, …)

最近在coursera上学习R语言,本博客主要是记录本人的从作业中收获到的一些内容,希望对R语言初学者有帮助。另:因为本人也是初学,博客中难免出现错误,希望各位批评指正。

这篇是关于function的一些介绍,有几个平时我没注意到的知识点在这里强调一下。

1.function的其他一些形式

我们常用的function,都是function(args1, args2, …)这样的形式,有时候也可以用一下其他的形式:

#这是一般的func函数,就是直接把参数args填在括号里
my_mean <- function(x) {
    sum(x)/length(x)
}

#参数多的时候,可以不用这样,比如:
add_alpha_and_beta <- function(...) {
    args <- list() #先将参数设置成一个list
    alpha <- args[["alpha"]]
    beta <- args[["beta"]] #指定alpha和beta
    alpha + beta #函数的功能,就是将这俩加起来
}

#还有的时候,可以用一个更简单的形式,就是%...%的形式,大概是酱紫
%add_left_and_right% <- function(left, right) {
    left + right
}
#这种形式的函数在使用的时候就会稍有不同
left %add_left_and_rigth% right

#我觉着,在指定一些计算左右两边的数据时,这种形式应该也是很好用的

2. 数据的批量读取

以前我读取数据都是read.csv(“D:\R\data\data.csv”)酱紫的,所以只能读一个,非常不好使,但是在作业中,要求从一个文件夹中读取一堆数据,这个我当时就懵了一下。但是想了想,可以用paste将路径和数据的名字粘在一起,做成一个list就可以了。当然,还有另外一种方法。

directory <- "D:\\R\\data" #这里的路径要填写自己的
files <- paste0(directory"\\", filenames) #filenames就是要读取的文件名组成的列表
## 这里要注意一下,paste0是粘贴完是没有空格的,paste是有空格的,如果用paste,需要用sep改一下间隔,如paste("a", "b", sep = "")
dat <- data.frame() #建一个空的数据框,一会装数据用
for (i in files) {
    tempcsv <- read.csv(i) #tempcsv是临时读取的文件
    dat <- rbind(dat, tempcsv)
    return(dat)
}
#这样所有读取的数据,就都进入dat了

而另一种方法,会更简单一点,就是使用dir()或者list.files()函数;这两种方法是我在知乎上看到的,这里给大家po一下

#用dir()函数
files <- dir(directory)
dat <- data.frame()
for (i in files) {
    tempcsv <- read.csv(i)
    dat <- rbind(dat, tempcsv)
    return(dat)
}

#用list.files()函数
files <- list.files(directory)
data <- lapply(files, function(file)){
    read.csv(paste0(directory, file), stringsAsFactors = FALSE)
})
data_cbind <- Reduce(cbind, data)
#这个方法是我抄的知乎上的,我自己没试过,也不太看得懂,但是dir()那个函数还是非常好用的。

3.当用function的参数取data.frame中的列时,$并不好用

这个标题可能解释的非常不清楚,我再来实际性的展示一次这个问题,如果没有做这次作业的话,我觉得以后遇到这样的问题可能会很麻烦。

#具体问题是这样子的
pollutantmean <- function(directory, pollutant, id){
  wd <- paste("D:\\R\\data\\", directory, sep = "")
  files <- dir(wd)
  data <- data.frame()
  for (i in id) {
    tempcsv <- read.csv(paste(wd, "\\", files[i], sep = ""))
    data <- rbind(data, tempcsv)
  }
  mean(data[[pollutant]], na.rm = TRUE)
}

在这个最后一行,mean(data[[pollutant]], na.rm = TRUR)这里,在取data的一列时,因为列名是函数中的一个参数,所以就不能使用”$”符号,而应该用双方括号[[]]。这个原理我不知道是为什么,但是这样做确实提取出来了。而有时候我同样用双括号又提取不出来,希望有大神能指导一下。

这一次的作业就写了这些东西,今天就到这里。

猜你喜欢

转载自blog.csdn.net/qq_42081859/article/details/82682557