R 自學指引 資料處理命令簡介與操作

資料合併

我們可使用 rbind()、merge() 來進行資料合併,不過 rbind() 是針對做橫向合併,merge() 則是縱向合併。可以將 rbind() 想是「行」的合併,merge() 則是「列」的合併。
merge(x, y, by = intersect(names(x), names(y)),
by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(“.x”,”.y”),
incomparables = NULL, …)
其中 x,y: 用於合併的兩個資料框,by,by.x,by.y 指定依據哪些行合併資料框,預設值為相同列名的列。
all,all.x,all.y 指定 x 和 y 的行是否應該全在輸出檔 。sort:by 指定的列是否要排序,suffixes 用來指定除 by 外相同列名的尾碼,incomparables 用來指定 by 中哪些單元不進行合併 。
> x <- c(1, 2, 3)  (ENTER)
> y <- c(10, 20, 30)  (ENTER)
透過 rbind() 可合併 row。
> rbind(x, y)   (ENTER)
[,1] [,2] [,3]
x    1    2    3
y   10   20   30
透過 cbind() 合併 column。
> cbind(x, y)(ENTER)
x  y
[1,] 1 10
[2,] 2 20
[3,] 3 30
> x <- cbind(c(“Tom”, “Joe”, “Vicky”), c(27, 29, 28))  (ENTER)
> y <- cbind(c(“Tom”, “Joe”, “Vicky”), c(178, 186, 168))  (ENTER)
> colnames(x) <- c(“name”,”age”)  (ENTER)
> colnames(y) <- c(“name”,”tall”)  (ENTER)
將 data.frame 透過一個欄位進行合併 name age tall。
> merge(x, y, by = “name”)  (ENTER)
name age tall
1   Joe  29  186
2   Tom  27  178
3 Vicky  28  168
> x <- cbind(c(“Tom”, “Joe”, “Vicky”, “Bob”), c(27, 29, 28, 25))  (ENTER)
> y <- cbind(c(“Tom”, “Joe”, “Vicky”, “Bruce”), c(178, 186, 168, 170))  (ENTER)
> colnames(x) <- c(“name”, “age”)  (ENTER)
> colnames(y) <- c(“name”, “tall”)  (ENTER)
all 用來詢問是否顯示所有資料,像 Bob 與 Bruce 都有一欄資料沒有。
> merge(x, y, by = “name”, all = T)  (ENTER)
name  age tall
1   Bob   25 <NA>
2   Joe   29  186
3   Tom   27  178
4 Vicky   28  168
5 Bruce <NA>  170
用 all = T 時,應該不會出現 Bob 與 Bruce 資料。只顯示 x 有的資料,Bruce 就不會出現了。
> merge(x, y, by = “name”, all.x = T)   (ENTER)
name age tall
1   Bob  25 <NA>
2   Joe  29  186
3   Tom  27  178
4 Vicky  28  168
只顯示 y 有的資料,Bob 就不會出現了。
> merge(x, y, by = “name”, all.y = T)  (ENTER)
name  age tall
1   Joe   29  186
2   Tom   27  178
3 Vicky   28  168
4 Bruce <NA>  170
以下是另一個 merge 的範例。
> id1 <- c(2, 3, 4, 5, 7)  (ENTER)
> weights <- c(62, 65, 71, 71, 67)  (ENTER)
> df1 <- data.frame(id = id1, weights)  (ENTER)
> id2 <- c(1, 2, 6:10)  (ENTER)
> heights <- c(147,113, 168, 135, 142, 159, 160)  (ENTER)
> df2 <- data.frame(id = id2, heights)  (ENTER)
> id2 <- c(1, 2, 6:10)  (ENTER)
> heights <- c(147, 113, 168, 135, 142, 159, 160)  (ENTER)
> df2 <- data.frame(id = id2, heights)  (ENTER)
> df1
id weights
1  2      62
2  3      65
3  4      71
4  5      71
5  7      67
> df2
id heights
1  1     147
2  2     113
3  6     168
4  7     135
5  8     142
6  9     159
7 10     160
以預設方式合併。
> merge(df1, df2, all = FALSE)  (ENTER)
id weights heights
1  2      62     113
2  7      67     135
接下來顯示所有的資料。
> merge(df1, df2, all = T)  (ENTER)
id weights heights
1   1      NA     147
2   2      62     113
3   3      65      NA
4   4      71      NA
5   5      71      NA
6   6      NA     168
7   7      67     135
8   8      NA     142
9   9      NA     159
10 10      NA     160

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。