一健小事

一蚊有難,百方支援。

R and Ronald (2): To code, or to recode

tocodeortorecode2

Quantitative researchers have only two choices: to code or not to code to recode.

做coursera或者玩現存dataset,一大缺失就是大多數是clean data,不用處理。這是我最介懷的。所以我想學好data cleaning。換言之,statistics的學習又被推遲了。沒有辦法,工餘學習就是這樣。

先製作一個dataframe:

manager <- c(1, 2, 3, 4, 5)
date <- c(“10/24/08″, “10/28/08″, “10/1/08″, “10/12/08″, “5/1/09″)
country <- c(“US", “US", “UK", “UK", “UK")
gender <- c(“M", “F", “F", “M", “F")
age <- c(32, 45, 25, 39, 99)
q1 <- c(5, 3, 3, 3, 2)
q2 <- c(4, 5, 5, 3, 2)
q3 <- c(5, 2, 5, 4, 1)
q4 <- c(5, 5, 5, NA, 2)
q5 <- c(5, 5, 2, NA, 1)
leadership <- data.frame(manager, date, country, gender, age, q1, q2, q3, q4, q5, stringsAsFactors=FALSE)
leadership

manager date country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
2 2 10/28/08 US F 45 3 5 2 5 5
3 3 10/1/08 UK F 25 3 5 5 5 2
4 4 10/12/08 UK M 39 3 3 4 NA NA
5 5 5/1/09 UK F 99 2 2 1 2 1

#移除不合理的資料

#要移除年齡欄的不合常理資料,將之歸類為NA:
leadership$age[leadership$age == 99] <- NA

#把numeric variable 變成 categorical variable,進而變成factor

#要transform年齡數字至categorical variable,最原始的方法是用within函數
(如果不用within,就要用leadership$agecat[leadership$age > 75] <- “Elder",繁贅):
leadership <- within(leadership,{
agecat <- NA
agecat[age>75] <- “Elder"
agecat[age>=55 & age<=75] <- “Middle Aged"
agecat[age<55] <- “Young"
})

leadership

manager date country gender age q1 q2 q3 q4 q5 agecat
1 1 10/24/08 US M 32 5 4 5 5 5 Young
2 2 10/28/08 US F 45 3 5 2 5 5 Young
3 3 10/1/08 UK F 25 3 5 5 5 2 Young
4 4 10/12/08 UK M 39 3 3 4 NA NA Young
5 5 5/1/09 UK F NA 2 2 1 2 1 <NA>

#然後把agecat內的值轉成factor:
agecat <- factor(agecat, order = TRUE, levels = c(“Young", “Middle Aged", “Elderly"))

#另一種方法是用cut函數:
leadership$age[leadership$age == 99] <- NA

agecat_cut <- cut(leadership$age,breaks = c(-1,55,75,Inf),labels = c(“Young","Middle Aged", “Elder"))
leadership <- cbind(leadership, agecat_cut)
leadership

manager date country gender age q1 q2 q3 q4 q5 agecat_cut
1 1 10/24/08 US M 32 5 4 5 5 5 Young
2 2 10/28/08 US F 45 3 5 2 5 5 Young
3 3 10/1/08 UK F 25 3 5 5 5 2 Young
4 4 10/12/08 UK M 39 3 3 4 NA NA Young
5 5 5/1/09 UK F NA 2 2 1 2 1 <NA>

#這方法順而定義每個值為factor。
is.factor(agecat_cut)
[1] TRUE

#參考網址:http://youtu.be/CNBlRHddWqI;http://youtu.be/__MlSLwJ8WI

#Renaming variables

#要更改dataframe的名稱,有三種方法。
#最簡單的是輸入fix(leadership)指令,然後在新視窗內的直接輸入新名稱。

#第二種方法是運用reshape library,然後運用rename函數:
library(reshape)
leadership <- rename(leadership, c(manager="managerID", date="testDate"))
leadership

managerID testDate country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
2 2 10/28/08 US F 45 3 5 2 5 5
3 3 10/1/08 UK F 25 3 5 5 5 2
4 4 10/12/08 UK M 39 3 3 4 NA NA
5 5 5/1/09 UK F 99 2 2 1 2 1

#第三種是透過names函數更改:
names(leadership)[1] <- “managerID"
names(leadership)[2] <- “testDate"
leadership

#一次過輸入變更,可輸入以下函數:
names(leadership)[1:2] <- c(“managerID", “testDate")

#Adding new variables

#要添加新變項,可以用transform函數
leadership <- transform(leadership, q6 = q1+q2)
leadership

managerID testDate country gender age q1 q2 q3 q4 q5 q6
1 1 10/24/08 US M 32 5 4 5 5 5 9
2 2 10/28/08 US F 45 3 5 2 5 5 8
3 3 10/1/08 UK F 25 3 5 5 5 2 8
4 4 10/12/08 UK M 39 3 3 4 NA NA 6
5 5 5/1/09 UK F 99 2 2 1 2 1 4

#Removing a variable

#如果dataframe簡單,我們可以設定某個變項為NULL,以移除整個變項
leadership$q6 = NULL
leadership

#missing values

#簡單運算時要移除NA個案,可以加上na.rm = TRUE
x <- c(1, 2, NA, 3)
y <- sum(x, na.rm=TRUE)
y
[1] 6

#listwise deletion

#只保留沒有NA的數據,可以用na.omit函數
leadership.clean <- na.omit(leadership)
leadership.clean

managerID testDate country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
2 2 10/28/08 US F 45 3 5 2 5 5
3 3 10/1/08 UK F 25 3 5 5 5 2
5 5 5/1/09 UK F 99 2 2 1 2 1
leadership

#Date

#現時的date column,性質是character。如果要轉做date format,需要用as.Date函數:

myformat <- “%m/%d/%y"
leadership$date <- as.Date(leadership$date, myformat)

#轉變後,我們可以分析及把日期數據繪成圖表

#Sorting data

#要按照某一欄的數字排序,可以用以下order函數:
newdata <- leadership[order(leadership$age),]
newdata

manager date country gender age q1 q2 q3 q4 q5
3 3 10/1/08 UK F 25 3 5 5 5 2
1 1 10/24/08 US M 32 5 4 5 5 5
4 4 10/12/08 UK M 39 3 3 4 NA NA
2 2 10/28/08 US F 45 3 5 2 5 5
5 5 5/1/09 UK F 99 2 2 1 2 1

#要用多一個序列,可以在order內的括號依序列出:
newdata2 <- leadership[order(leadership$gender, leadership$age),]
newdata2

manager date country gender age q1 q2 q3 q4 q5
3 3 10/1/08 UK F 25 3 5 5 5 2
2 2 10/28/08 US F 45 3 5 2 5 5
5 5 5/1/09 UK F 99 2 2 1 2 1
1 1 10/24/08 US M 32 5 4 5 5 5
4 4 10/12/08 UK M 39 3 3 4 NA NA

#如果要由尾至頭排序,則需要用負號:
newdata3 <- leadership[order(leadership$gender, -leadership$age),]
newdata3

manager date country gender age q1 q2 q3 q4 q5
5 5 5/1/09 UK F 99 2 2 1 2 1
2 2 10/28/08 US F 45 3 5 2 5 5
3 3 10/1/08 UK F 25 3 5 5 5 2
4 4 10/12/08 UK M 39 3 3 4 NA NA
1 1 10/24/08 US M 32 5 4 5 5 5

#Merging datasets
#Adding columns
#把多個dataframes拼在一起,可以用merge函數,然後用by指明一個或多個共同的變項,各行的數據會跟據共同的變項湊合。

#先產生一個leadership02的dateframe:
manager <- c(1, 2, 3, 4, 5)
date <- c(“10/24/08″, “10/28/08″, “10/1/08″, “10/12/08″, “5/1/09″)
country <- c(“US", “US", “UK", “UK", “UK")
gender <- c(“M", “F", “F", “M", “F")
age <- c(32, 45, 25, 39, 99)
q6 <- c(100, 101, 102, 103, 104)
q7 <- c(200, 201, 202, 203, 204)
leadership02 <- data.frame(manager, date, country, gender, age, q6, q7, stringsAsFactors=FALSE)
leadership02

total <- merge(leadership, leadership02, by=c(“manager","gender", “date", “country", “age"))
total

manager gender date country age q1 q2 q3 q4 q5 q6 q7
1 1 M 10/24/08 US 32 5 4 5 5 5 100 200
2 2 F 10/28/08 US 45 3 5 2 5 5 101 201
3 3 F 10/1/08 UK 25 3 5 5 5 2 102 202
4 4 M 10/12/08 UK 39 3 3 4 NA NA 103 203
5 5 F 5/1/09 UK 99 2 2 1 2 1 104 204

#參考網址:http://www.princeton.edu/~otorres/Merge101R.pdf

#如果只需直接拼合兩個dataframe,那就用cbind函數:
cbind(leadership, leadership02)

#Adding rows
#加列通常是為了增加個案數目,用rbind函數:
total <- rbind(dataframe1, dateframe2)
total

#如果兩個dateframe的長度不同,那可以用library(plyr)函數解決:

manager <- c(6, 7, 8, 9, 10)
date <- c(“10/24/08″, “10/28/08″, “10/1/08″, “10/12/08″, “5/1/09″)
country <- c(“US", “US", “UK", “UK", “UK")
age <- c(32, 45, 25, 39, 99)
q1 <- c(5, 3, 3, 3, 2)
q2 <- c(4, 5, 5, 3, 2)
q3 <- c(5, 2, 5, 4, 1)
q4 <- c(5, 5, 5, NA, 2)
q5 <- c(5, 5, 2, NA, 1)
height <- c(170, 171, 172, 173, 174)
leadership03 <- data.frame(manager, date, country, age, q1, q2, q3, q4, q5, height, stringsAsFactors=FALSE)
leadership03

manager date country age q1 q2 q3 q4 q5 height
1 6 10/24/08 US 32 5 4 5 5 5 170
2 7 10/28/08 US 45 3 5 2 5 5 171
3 8 10/1/08 UK 25 3 5 5 5 2 172
4 9 10/12/08 UK 39 3 3 4 NA NA 173
5 10 5/1/09 UK 99 2 2 1 2 1 174

library(“plyr")
leadership_combined <- rbind.fill(leadership, leadership03)
leadership_combined

manager date country gender age q1 q2 q3 q4 q5 height
1 1 10/24/08 US M 32 5 4 5 5 5 NA
2 2 10/28/08 US F 45 3 5 2 5 5 NA
3 3 10/1/08 UK F 25 3 5 5 5 2 NA
4 4 10/12/08 UK M 39 3 3 4 NA NA NA
5 5 5/1/09 UK F 99 2 2 1 2 1 NA
6 6 10/24/08 US <NA> 32 5 4 5 5 5 170
7 7 10/28/08 US <NA> 45 3 5 2 5 5 171
8 8 10/1/08 UK <NA> 25 3 5 5 5 2 172
9 9 10/12/08 UK <NA> 39 3 3 4 NA NA 173
10 10 5/1/09 UK <NA> 99 2 2 1 2 1 174

#Subsetting datasets

#Selecting variables
#抽取一個dataframe內某幾個變項,抽取所需行數:
leadership04 <- leadership[,c(6:10)]
leadership04

q1 q2 q3 q4 q5
1 5 4 5 5 5
2 3 5 2 5 5
3 3 5 5 5 2
4 3 3 4 NA NA
5 2 2 1 2 1

#Dropping (excluding) variables
#要丟棄一個dataframe內某幾個變項,可以移除不要的變項的行數:
leadership05 <- leadership[,-c(1:5)]
leadership05

q1 q2 q3 q4 q5
1 5 4 5 5 5
2 3 5 2 5 5
3 3 5 5 5 2
4 3 3 4 NA NA
5 2 2 1 2 1

#或者把移除的變項逐個定義為NULL:
leadership06 <- leadership
leadership06$manager <- leadership06$date <- NULL
leadership06

country gender age q1 q2 q3 q4 q5
1 US M 32 5 4 5 5 5
2 US F 45 3 5 2 5 5
3 UK F 25 3 5 5 5 2
4 UK M 39 3 3 4 NA NA
5 UK F 99 2 2 1 2 1

#或者用 %in% 符號,原理是選擇剔除提及的變項名稱的所有資料:
newvar <- names(leadership) %in% c(“manager", “date")
leadership07 <- leadership[!newvar]
leadership07

#原理是運用logical。在leadership的各個變項名稱當中,尋找哪個符合manager和date。定義並輸入newvar會出現T T F F F F F F F F。
# !newvar 可以反轉logical values
# leadership07[!newvar] 即顯示T的變項

country gender age q1 q2 q3 q4 q5
1 US M 32 5 4 5 5 5
2 US F 45 3 5 2 5 5
3 UK F 25 3 5 5 5 2
4 UK M 39 3 3 4 NA NA
5 UK F 99 2 2 1 2 1

#Selecting observations

#如果只想找某幾個樣本,那可以輸入要顯示的列數:
newdata <- leadership[1:3,]
newdata

manager date country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
2 2 10/28/08 US F 45 3 5 2 5 5
3 3 10/1/08 UK F 25 3 5 5 5 2

#如果要多幾個篩選準則,可輸入logicals:
newdata <- leadership[which(leadership$gender=="M" &
leadership$age > 30),]
newdata

manager date country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
4 4 10/12/08 UK M 39 3 3 4 NA NA

#捷徑

newdata <- subset(leadership, age >= 35 | age < 24,
select=c(q1, q2, q3, q4))
newdata

q1 q2 q3 q4
2 3 5 2 5
4 3 3 4 NA
5 2 2 1 2

newdata <- subset(leadership, gender=="M" & age > 25,
select=gender:q4)
newdata

gender age q1 q2 q3 q4
1 M 32 5 4 5 5
4 M 39 3 3 4 NA

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

Information

This entry was posted on 2015/01/19 by in Uncategorized and tagged , .

網誌統計

  • 68,187 點擊次數
William on the way

…………我,在途上,義無反顧…………

Shenzhen Noted

blogging urban change since 2005

窮游破事兒

遊記、時評、採訪心得、滄海遺珠

思敏愛南洋

I Am Sze Ming Lee

東亞新觀點

走入亞洲,專門關注東亞國際政經動態

失去。擁有

人一直在尋求依賴,我們太害怕未知,寧願選擇一成不變。到頭來,其實我們從來都是一個人。

looking for the story that matters

續尋。留聲的一二事 | 方欣浩

基進報導

為無權者充權

死也要去旅行

一個精算師, 在香港返工太沉悶, 不習慣在一個地方呆得太久. 最近, 跟公司請了半年假, 決定要用一雙腳踏遍南美洲的土地

凍啡走甜

Justin Yip。第四代香港人。好懶醒,自大又自卑。面前有珍饈百味,但總覺隔離飯香。

Awesome Life

If you are adventurous in your choices, you’ll have a lot more fun and excitement

0987255046o

A modern business theme

%d 位部落客按了讚: