chainsawriot

Home | About | Archive

Data frame

Posted on Apr 24, 2009 by Chung-hong Chan

很多人學 R 都是這樣學的:用手頭上的數據,用疑問去指引在 R 的分析法。我自己都是這樣學。但這樣學有問題,就是基本的操作會不熟,到真的要做分析時,會覺得很不自在。
基本操作,是指如 Data frame 的運作之類。很多人都不太熟。就算看 Introduction to R , Data Frame 的運作都是用一種理論方式介紹,而不是用實用方向出發。
我認為學 R ,由其是用作分析小規模數據如醫學研究的,最少都要學以下幾招旁身。

1. 讀入 SPSS/CSV

可使用 read.csv 或 foreign 套件的 read.spss 。如

2. 假定我有 data frame 一個如此

gender age bp
1 0 20 120
2 1 8 111
3 1 999 123
4 0 14 111

例如我想列出 my.data 內的 bp ,可用以下方法

> my.data$bp
[1] 120 111 123 111

> my.data[,3]
[1] 120 111 123 111

my.data[x,y] 的 x 及 y , x 是第幾個 case (橫行),y 是第幾個 variable ,例如我只想列出第一個 case

> my.data[1,]
gender age bp
1 0 20 120

或第三個 case 的第二個 variable (即 age )

> my.data[3,2]
[1] 999

第二及第三個 variable

> my.data[,2:3]
age bp
1 20 120
2 8 111
3 999 123
4 14 111

3. 例如我想找出 age 是 999 的 case

> my.data[my.data$age==999,]
gender age bp
3 1 999 123

又或者只列出有沒有 age 是 999

> my.data$age[my.data$age==999]
[1] 999

注意,是沒有 coma 的。假如 999 其實是 missing value ,我們可以這樣的 recode

> my.data$age[my.data$age==999] < - NA > my.data
gender age bp
1 0 20 120
2 1 8 111
3 1 NA 123
4 0 14 111

4. Gender 現在是以 0,1 表示,你可改為 factor 。

> my.data$gender < - factor(my.data$gender, levels=0:1, labels=c("male","female")) > my.data
gender age bp
1 male 20 120
2 female 8 111
3 female NA 123
4 male 14 111

5. 假定有些功能不接受 missing value ,可用以下方法選出沒有 missing 的 observation

> my.data[rowSums(is.na(my.data))==0, ]
gender age bp
1 male 20 120
2 female 8 111
4 male 14 111


Powered by Jekyll and profdr theme