目錄: 創建新變數 變數重編碼 日期值 數據排序 數據集合併 數據子集 隨機取樣 創建新變數 算術運算函數:x%%y 【求餘 x mod y, 5%%2的結果為1】, x%/%y 【整數除法,5% / %2 結果為2】, ^或 ** 求冪 如下示例數據,在對象中增加平均、合計變數(場景不大合適,主要 ...
目錄:
- 創建新變數
- 變數重編碼
- 日期值
- 數據排序
- 數據集合併
- 數據子集
- 隨機取樣
創建新變數
- 算術運算函數:x%%y 【求餘 x mod y, 5%%2的結果為1】, x%/%y 【整數除法,5% / %2 結果為2】, ^或 ** 求冪
- 如下示例數據,在對象中增加平均、合計變數(場景不大合適,主要為了說明問題)
- 有多種方式來實現新增變數的處理,推薦使用 transform 示例代碼如下:
> mydata <- transform(mydata,avg = (age + weight)/2 , total = age + weight) > mydata name age weight avg total 1 張三 32 42 37.0 74 2 李四 45 56 50.5 101 3 王五 25 120 72.5 145 4 趙六 39 120 79.5 159 5 老二 199 180 189.5 379
變數重編碼
- 變數重編碼涉及根據現有變數的值創建新值的過程,如下圖,按客戶年齡分為青年、中年、老年進行統計
- 上圖中,199明顯是異常數據,在進行轉換前必須將此賦為缺失值,語法為:
> mydata$age[mydata$age == 199] <- NA > mydata name age weight 1 張三 32 42 2 李四 45 56 3 王五 25 120 4 趙六 39 120 5 老二 NA 180
- 變數重編碼,示例代碼如下:
> mydata <- within(mydata,{ + agecat <- NA + agecat[age >= 45] <- "Elder" + agecat[age > 25 & age < 45] <- "Middle Aged" + agecat[age <= 25] <- "Young"}) > mydata name age weight agecat 1 張三 32 42 Middle Aged 2 李四 45 56 Elder 3 王五 25 120 Young 4 趙六 39 120 Middle Aged 5 老二 NA 180 <NA>
-
註意:
-
with() 與 within() 函數功能類似,不同點在於它允許你修改數據框
- 或 (|)與並(&)單字元表示與C#語法不一樣
- 上圖第5行數據包含缺失值,含用缺失值的算術表達式和函數的計算結果也是缺失值,通過na.omit()函數可刪除帶缺失值的行
- 大多數函數都擁有na.rm = TRUE選項,可在計算前移除缺失值並使用剩餘的值進行計算,如下
> sum(mydata$age) [1] NA > sum(mydata$age,na.rm = TRUE) [1] 141
日期值
- 日期值預設輸入格式為:yyyy-mm-dd, R中通常以字元輸入,通過as.Date()函數進行轉換,輸入格式如下:
- %y 兩位數的年份 如: 07
- %Y 四位數的年份 如: 2007
- %a 縮寫的星期名 如: Mon
- %A 星期名 如: Monday
- %b 縮寫的月份 如: Jan
- %B 月份 如: January
- %m 月份(00-12)
- %d 日期(00-31)
- sys.Date(): 返回當天的日期
- date(): 返回當前的日期和時間
- difftime(): 計算時間間隔,語法:difftime(time1, time2, units = c("auto", "secs", "mins", "hours","days", "weeks"))
- 註意:R內部最小日期 1970.01.01
- 示例如下:
> t <- Sys.time();t #獲取當前時間 [1] "2016-10-11 17:43:27 CST" > as.POSIXlt(t-24*60*60) #獲取一天前的日期 [1] "2016-10-10 17:43:27 CST" > l <- unclass(t);l #長整形的數據自1970-01-01年開始 [1] 1476179008 > as.POSIXct(l,origin = "1970-01-01") #將長整形的數據轉換為日期型數據 [1] "2016-10-11 17:43:27 CST" > format(t,format="%Y-%m-%d %H:%M:%S") #自定義時間格式 [1] "2016-10-11 17:43:27" > dob<-as.Date("2016-10-01") > difftime(t,dob,units = "days") #計算時間差 Time difference of 10.40518 days
數據排序
- order()函數可對一個數據框排序,預設是升序,在變數前加減號可得到降序的排序效果
- 上例按年齡升序、體重降序排列代碼示例:
> with(mydata,{ + orderData <<- mydata[order(age,-weight),] + }) > orderData name age weight avg total 3 王五 25 120 72.5 145 1 張三 32 42 37.0 74 4 趙六 39 120 79.5 159 2 李四 45 56 50.5 101 5 老二 199 180 189.5 379
數據集合併
- merge(): 通過一個或多個共有變數橫向合半兩個數據框(即一種內聯結,inner join)
- 語法: total <- merge(dataframeA, dataframeB,by=c("ID","country")) #按ID和country進行合併
- 按下麵各科成績數據與第一小節人員信息數據集合併示例
- 示例代碼:
> merge(m1,score,by=c("name")) name age weight yw sx yy 1 老二 199 180 100 100 100 2 李四 45 56 80 87 76 3 王五 25 120 100 98 87 4 張三 32 42 90 80 100 5 趙六 39 120 94 92 90
- cbind(): 直接橫向合併兩個數據框,不需要指定公共索引時使用,要求:每個對象擁有相同的數據行數和排序順序
- 示例代碼:
> cbind(m1,score) name age weight name yw sx yy 1 張三 32 42 張三 90 80 100 2 李四 45 56 李四 80 87 76 3 王五 25 120 王五 100 98 87 4 趙六 39 120 趙六 94 92 90 5 老二 199 180 老二 100 100 100
- rbind(): 縱向合併兩個數據框(兩個數據框必須擁有相同的變數名,順序不必一定相同), 示例如下:
> m2 <- data.frame(name=m1$name,yw=m1$age,sx=m1$weight,yy=m1$weight%%m1$age) > rbind(m2,score) name yw sx yy 1 張三 32 42 10 2 李四 45 56 11 3 王五 25 120 20 4 趙六 39 120 3 5 老二 199 180 180 6 張三 90 80 100 7 李四 80 87 76 8 王五 100 98 87 9 趙六 94 92 90 10 老二 100 100 100
-
數據集取子集
- 以上一節 cbind(m1,score) 合併後的數據集為例,取1、2、6、7 列數據,實現方式如下:
- 方式一:保留變數
> x <- cbind(m1,score);x name age weight test name yw sx yy 1 張三 32 42 10 張三 90 80 100 2 李四 45 56 11 李四 80 87 76 3 王五 25 120 20 王五 100 98 87 4 趙六 39 120 3 趙六 94 92 90 5 老二 199 180 180 老二 100 100 100 > y <- x[,c(1,2,5,6)];y name age name.1 yw 1 張三 32 張三 90 2 李四 45 李四 80 3 王五 25 王五 100 4 趙六 39 趙六 94 5 老二 199 老二 100
- 方式二:剔除變數 (在某一列的前面加負號就會剔除某列)
> z <- x[,c(-3,-4,-5,-8)];z name age yw sx 1 張三 32 90 80 2 李四 45 80 87 3 王五 25 100 98 4 趙六 39 94 92 5 老二 199 100 100
- 方式三:賦NULL值,註意:NULL 與 NA是不同的
> x$weight <- x$test <- x[,5] <- x$yy <- NULL
> x
name age yw sx
1 張三 32 90 80
2 李四 45 80 87
3 王五 25 100 98
4 趙六 39 94 92
5 老二 199 100 100
- 方式四:subset()取子集
> x1 <- cbind(m1,score);x1 name age weight name yw sx yy 1 張三 32 42 張三 90 80 100 2 李四 45 56 李四 80 87 76 3 王五 25 120 王五 100 98 87 4 趙六 39 120 趙六 94 92 90 5 老二 199 180 老二 100 100 100 > subset(x1,age>=25 & age < 50,select = c("name","age","yw","sx")) name age yw sx 1 張三 32 90 80 2 李四 45 80 87 3 王五 25 100 98 4 趙六 39 94 92
- 方法五: sqldf()函數使用sql語句對數據框進行操作,需安裝 sqldf 包,語法: install.packages("sqldf")
> x1 <- merge(m1,score,by=c("name"));x1 name age weight yw sx yy 1 老二 199 180 100 100 100 2 李四 45 56 80 87 76 3 王五 25 120 100 98 87 4 張三 32 42 90 80 100 5 趙六 39 120 94 92 90 > library(sqldf) > sqldf("select name,age,yw,sx,yy from x1 where age >=25 and age < 35 order by age") name age yw sx yy 1 王五 25 100 98 87 2 張三 32 90 80 100
-
隨機取樣
- sample(): 從大資料庫中隨機抽取大小為n的樣本,在數據挖掘和機器學習領域,抽樣是常見的做法
- replace 參數控制抽取數據有放回或無放回
- 示例:從上例x1 對象中隨機無放回取2份樣本
> y1 <- x1[sample(1:nrow(x1),size = 2,replace = FALSE),] > y1 name age weight yw sx yy 2 李四 45 56 80 87 76 5 趙六 39 120 94 92 90 > y1 <- x1[sample(1:nrow(x1),size = 2,replace = FALSE),] > y1 name age weight yw sx yy 1 老二 199 180 100 100 100 3 王五 25 120 100 98 87