2014/11/19

[R] 第4篇 資料操作 (上)

R 的資料操作

R 運算符號與其他語言大同小異,包含加减乘除、次方 (^ 或 **)、取餘數 (mod: x%%y) 及整數除法 (x%/%y)。
邏輯運算符號也差不多,大於小於等於,而 OR (x | y) 及 AND (x & y) 是用一個符號表示。資料中若有無意義的資料,可以將該筆資料訂為 NA (Not Available)。實務上,假設某一特定年齡區間的資料,才是有意義的,那就設定一組條件,將不符合該條件的資料設定為 NA。
> name <- c("Alice", "Bill", "Cindy", "David", "Eason")
> age <- c(-12, 23, 21, 27, 63)
> df <- data.frame(name, age)
> df
   name age
1 Alice -12
2  Bill  23
3 Cindy  21
4 David  27
5 Eason  63
## set the rule for specific range
> rule <- df$age < 20 | df$age > 29
> df$age[rule] <- NA
> df
   name age
1 Alice  NA
2  Bill  23
3 Cindy  21
4 David  27
5 Eason  NA

## just put the condition in bracket 
> df$age[df$age < 20 | df$age > 29] <- NA
variable[condition] <- expression,當 condition 為 TRUE 時,就會將 variable 設為 expression。

NA 定義為不完整的資料,若用 == 來比對 NA 是不會為 TRUE。而 NaN (Not a Number) 是 NA 的一種,是在運算上會出現的結果,像是除法中分母為 0 的情況。is.nais.nan 是能幫助我們辨別 NA 及 NaN 的方法,如果運算的資料中有 NA 資料,那麼運算結果就會是 NA 的一種。
> naVar <- NA
> naVar == NA
[1] NA

## try is.na() & is.nan()
> x <- c(1, 2, NaN, NA, 4)
> is.na(x)
[1] FALSE FALSE  TRUE  TRUE FALSE
> is.nan(x)
[1] FALSE FALSE  TRUE FALSE FALSE

> x <- c(1, 2, NA, 4)
> y <- sum(x)
> y
[1] NA
> x <- c(1, 2, NaN, NA, 4)
> y <- sum(x)
> y
[1] NaN
## remove NA in calculation
> y <- sum(x, na.rm = TRUE)
> y
[1] 7
如果要將一 row 的無效 data 刪除,用 na.omit 的方法,利用上面的 df 來試試。
> df
   name age
1 Alice  NA
2  Bill  23
3 Cindy  21
4 David  27
5 Eason  NA
> vaild <- na.omit(df)
> vaild
   name age
2  Bill  23
3 Cindy  21
4 David  27
欲修改 data frame 的變量名稱,可以用 namesrename 來修改,指令為 rename(dataframe, c(oldName = "newName", ...))
使用 rename 時,需要載入 reshape library,如果沒有,需先用 install.packages() 安裝。
> library(reshape)
Error in library(reshape) : there is no package called ‘reshape’
> install.packages('reshape')
> library(reshape)

## use rename function
> rename(df, c(name = "id"))
     id age
1 Alice -12
2  Bill  23
3 Cindy  21
4 David  27
5 Eason  63

## use names function
> names(df)[1] <- "name"
> df
   name age
1 Alice -12
2  Bill  23
3 Cindy  21
4 David  27
5 Eason  63
> names(df)[1:2] <- c("Tester", "TesterAge")
> df
  Tester TesterAge
1  Alice       -12
2   Bill        23
3  Cindy        21
4  David        27
5  Eason        63

沒有留言:

張貼留言