R語言學習筆記 - 函式的使用
最近在coursera上學習R語言,本部落格主要是記錄本人的從作業中收穫到的一些內容,希望對R語言初學者有幫助。另:因為本人也是初學,部落格中難免出現錯誤,希望各位批評指正。
這篇是關於function的一些介紹,有幾個平時我沒注意到的知識點在這裡強調一下。
[TOC]
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的一列時,因為列名是函式中的一個引數,所以就不能使用"$"符號,而應該用雙方括號[[]]。這個原理我不知道是為什麼,但是這樣做確實提取出來了。而有時候我同樣用雙括號又提取不出來,希望有大神能指導一下。
這一次的作業就寫了這些東西,今天就到這裡。
版權宣告:作者保留權利,嚴禁修改,轉載請註明原文連結。
資料人網是資料人學習、交流和分享的平臺http://shujuren.org 。專注於從資料中學習到有用知識。 平臺的理念:人人投稿,知識共享;人人分析,洞見驅動;智慧聚合,普惠人人。 您在資料人網平臺,可以1)學習資料知識;2)建立資料部落格;3)認識資料朋友;4)尋找資料工作;5)找到其它與資料相關的乾貨。 我們努力堅持做原創,聚合和分享優質的省時的資料知識! 我們都是資料人,資料是有價值的,堅定不移地實現從資料到商業價值的轉換!