2012-10-08 45 views
23

Hãy xem xét mã R sau.Tạo khung dữ liệu từ hai vectơ sử dụng cbind

> x = cbind(c(10, 20), c("[]", "[]"), c("[[1,2]]","[[1,3]]")) 
> x 
    [,1] [,2] [,3]  
[1,] "10" "[]" "[[1,2]]" 
[2,] "20" "[]" "[[1,3]]" 

Tương tự

> x = rbind(c(10, "[]", "[[1,2]]"), c(20, "[]", "[[1,3]]")) 
> x 
    [,1] [,2] [,3]  
[1,] "10" "[]" "[[1,2]]" 
[2,] "20" "[]" "[[1,3]]" 

Bây giờ, tôi không muốn các số nguyên 1020 được chuyển đổi sang chuỗi. Làm cách nào để thực hiện thao tác này mà không có bất kỳ chuyển đổi nào như vậy? Tôi sẽ tham gia khóa học cũng muốn biết tại sao chuyển đổi này xảy ra. Tôi đã xem số trợ giúp cbind và cũng đã dùng thử Google, nhưng không có may mắn khi tìm giải pháp . Tôi cũng tin rằng trong một số trường hợp. R chuyển đổi các chuỗi thành các yếu tố và tôi không muốn điều đó xảy ra, mặc dù dường như không phải là để xảy ra ở đây.

+0

Vấn đề không phải là với 'cbind', nhưng với' c'. Đó là chức năng bạn cần hiểu rõ hơn. –

Trả lời

28

Vectơ và ma trận chỉ có thể là một loại duy nhất và cbindrbind trên vectơ sẽ cung cấp ma trận. Trong những trường hợp này, các giá trị số sẽ được tăng lên các giá trị ký tự vì loại đó sẽ giữ tất cả các giá trị.

(Lưu ý rằng trong rbind ví dụ của bạn, chương trình khuyến mãi sẽ xảy ra trong c gọi:.

> c(10, "[]", "[[1,2]]") 
[1] "10"  "[]"  "[[1,2]]" 

Nếu bạn muốn có một cấu trúc hình chữ nhật, nơi các cột có thể loại khác nhau, bạn muốn có một data.frame Bất kỳ những điều sau đây nên giúp bạn có được những gì bạn muốn:

> x = data.frame(v1=c(10, 20), v2=c("[]", "[]"), v3=c("[[1,2]]","[[1,3]]")) 
> x 
    v1 v2  v3 
1 10 [] [[1,2]] 
2 20 [] [[1,3]] 
> str(x) 
'data.frame': 2 obs. of 3 variables: 
$ v1: num 10 20 
$ v2: Factor w/ 1 level "[]": 1 1 
$ v3: Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2 

hoặc (sử dụng đặc biệt là phiên bản data.frame của cbind)

01.
> x = cbind.data.frame(c(10, 20), c("[]", "[]"), c("[[1,2]]","[[1,3]]")) 
> x 
    c(10, 20) c("[]", "[]") c("[[1,2]]", "[[1,3]]") 
1  10   []     [[1,2]] 
2  20   []     [[1,3]] 
> str(x) 
'data.frame': 2 obs. of 3 variables: 
$ c(10, 20)    : num 10 20 
$ c("[]", "[]")   : Factor w/ 1 level "[]": 1 1 
$ c("[[1,2]]", "[[1,3]]"): Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2 

hoặc (sử dụng cbind, nhưng làm cho người đầu tiên một data.frame để nó kết hợp như data.frames làm):

> x = cbind(data.frame(c(10, 20)), c("[]", "[]"), c("[[1,2]]","[[1,3]]")) 
> x 
    c.10..20. c("[]", "[]") c("[[1,2]]", "[[1,3]]") 
1  10   []     [[1,2]] 
2  20   []     [[1,3]] 
> str(x) 
'data.frame': 2 obs. of 3 variables: 
$ c.10..20.    : num 10 20 
$ c("[]", "[]")   : Factor w/ 1 level "[]": 1 1 
$ c("[[1,2]]", "[[1,3]]"): Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2 
+0

Cảm ơn câu trả lời chi tiết. Tôi không nghĩ rằng tôi cần các đặc tính của các yếu tố ở đây, và sự hồi tưởng của tôi là chúng có thể gây ra vấn đề. Có cách nào để tạo khung dữ liệu với các giá trị chuỗi thay thế không? –

+0

Thêm 'stringsAsFactors = FALSE' vào lệnh gọi' data.frame'.Nếu các cuộc gọi được ngầm định (như trong ví dụ cuối), thì bạn phải làm cho chúng rõ ràng: 'data.frame (c (" [] "," [] "), stringsAsFactors = FALSE)'. –

+0

Có một tùy chọn toàn cục 'stringsAsFactors' cũng kiểm soát điều này. Tôi để nó như là mặc định vận chuyển và thay đổi nó trên một cơ sở cần thiết cho khả năng tái sản xuất. –

9

Sử dụng data.frame thay vì cbind nên hữu ích

x <- data.frame(col1=c(10, 20), col2=c("[]", "[]"), col3=c("[[1,2]]","[[1,3]]")) 
x 
    col1 col2 col3 
1 10 [] [[1,2]] 
2 20 [] [[1,3]] 

sapply(x, class) # looking into x to see the class of each element 
    col1  col2  col3 
"numeric" "factor" "factor" 

Như bạn có thể thấy các yếu tố từ col1 là numeric như bạn muốn.

data.frame có thể có các biến khác nhau class: numeric, factorcharacter nhưng matrix không, một khi bạn đặt một yếu tố character thành một ma trận tất cả các khác sẽ trở thành lớp này không có vấn đề gì clase họ trước đó.

+0

Cảm ơn. Tôi có thể tạo lớp 'col2' và' col3' thành chuỗi không? –

+0

Xin lỗi tôi đã nhầm lẫn tôi có nghĩa là lớp 'character' thay vì' string' để xem những gì lớp R xử lý xem [this] (http://stat.ethz.ch/R-manual/R-patched/library/methods/html /Classes.html), bạn có thể coerce 'factor' thành' character' bằng cách thực hiện 'as.character (factor)'. –

Các vấn đề liên quan