2013-10-13 19 views
9

Tôi thậm chí không chắc chắn cách đặt tiêu đề câu hỏi đúng cách!R sắp xếp lại khung dữ liệu: một số hàng thành cột

Giả sử tôi có một dataframe d:

dataframe hiện tại:

d <- data.frame(sample = LETTERS[1:2], cat = letters[11:20], count = c(1:10)) 

    sample cat count 
1  A k  1 
2  B l  2 
3  A m  3 
4  B n  4 
5  A o  5 
6  B p  6 
7  A q  7 
8  B r  8 
9  A s  9 
10  B t 10 

và tôi đang cố gắng để sắp xếp lại mọi thứ như vậy mà mỗi giá trị con mèo trở thành một cột của riêng nó, mẫu vẫn là một cột (hoặc trở thành tên hàng), và đếm sẽ là các giá trị trong các cột mèo mới, với 0 nơi một mẫu không có số đếm cho một con mèo. Cũng giống như vậy:

mong muốn bố trí dataframe:

sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 

cách tốt nhất để đi về vấn đề này là gì?

Đây là như xa như tôi đã nhận:

for (i in unique(d$sample)) { 
    s <- d[d$sample==i,] 
    st <- as.data.frame(t(s[,3])) 
    colnames(st) <- s$cat 
    rownames(st) <- i 
} 

ví dụ vòng lặp thông qua các mẫu trong dataframe ban đầu, và transposing cho mỗi tập con mẫu. Vì vậy, trong trường hợp này tôi có được

k m o q s 
A 1 3 5 7 9 

l n p r t 
B 2 4 6 8 10 

Và đây là nơi tôi gặp khó khăn. Tôi đã thử một loạt các thứ với hợp nhất(), bind(), apply(), ... nhưng tôi dường như không thể đánh đúng thứ. Plus, tôi không thể không tự hỏi nếu vòng lặp đó ở trên là một bước cần thiết ở tất cả - một cái gì đó với unstack() có lẽ?

Không cần phải nói, tôi là người mới đối với R ... Nếu ai đó có thể giúp tôi, điều đó sẽ được đánh giá cao!

Lý do PS Tôi đang cố gắng sắp xếp lại khung dữ liệu của mình với hy vọng làm cho việc vẽ các giá trị dễ dàng hơn (nghĩa là tôi muốn hiển thị df thực tế trong một âm mưu theo định dạng bảng).

Cảm ơn bạn!

+0

Thao tác bạn muốn làm là chuyển từ "dài" sang "rộng". Câu hỏi này đã được hỏi và trả lời nhiều lần trước đây. – nograpes

+1

Lời xin lỗi của tôi. Tôi đã tìm kiếm vô tận thông qua ở đây và google, tôi chỉ không thể tìm thấy bất cứ điều gì khá giống như những gì tôi cần (không biết chính xác làm thế nào để gọi những gì tôi cần là không giúp đỡ). Tôi sẽ có một cái nhìn cho "dài"/"rộng" ... – crs

Trả lời

9

Sử dụng reshape từ cơ sở R:

nn<-reshape(d,timevar="cat",idvar="sample",direction="wide") 
names(nn)[-1]<-as.character(d$cat) 
nn[is.na(nn)]<-0 
> nn 
    sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 
+0

Cảm ơn, @Metrics - cũng hoạt động! (và bây giờ tôi hiểu những gì nograpes đã đề cập đến với "dài" và "rộng" trong bình luận của mình!). Giải pháp của Jilber trông ngắn gọn hơn - khác biệt là gì? Cảm ơn bạn đã giúp đỡ! Luôn luôn tốt để học thêm sth. – crs

+1

@crs, sự khác biệt lớn là cả 'xtabs' và' dcast' thực sự chỉ có một biến "giá trị" để chuyển đổi thành định dạng rộng. Ví dụ, hãy thử dòng đầu tiên của mã Metrics sau khi thực hiện một thay đổi nhỏ cho "d" 'data.frame' ban đầu của bạn:' d $ blah <- 11: 20'. Bây giờ, hãy thử làm tương tự với 'dcast' hoặc' xtabs'. Với 'dcast', đầu ra tương tự có thể được thực hiện sau khi' làm mới' dữ liệu của bạn. Với 'xtabs' bạn sẽ phải định hình lại các biến riêng biệt và' cbind' chúng lại với nhau. Và 'reshape()' khá nhanh, đặc biệt là so với việc thực hiện 'dcast' hiện tại. – A5C1D2H2I1M1N2O1R2T1

+1

Chỉ số: +1, nhưng một lần nữa, tôi không biết liệu tôi có gặp rắc rối khi đổi tên hay không. Trong trường hợp này, vì ví dụ mở rộng mà tôi đã mô tả trong phần bình luận ở trên ... – A5C1D2H2I1M1N2O1R2T1

12

Sử dụng dcast từ reshape2 gói

> dcast(d, sample~cat, fill=0) 
    sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 

xtabs từ cơ sở là một thay thế

> xtabs(count~sample+cat, d) 
     cat 
sample k l m n o p q r s t 
    A 1 0 3 0 5 0 7 0 9 0 
    B 0 2 0 4 0 6 0 8 0 10 

Nếu bạn thích các đầu ra là một data.frame, sau đó thử:

> as.data.frame.matrix(xtabs(count~sample+cat, d)) 
    k l m n o p q r s t 
A 1 0 3 0 5 0 7 0 9 0 
B 0 2 0 4 0 6 0 8 0 10 
+0

Ông, điều này có vẻ gọn gàng. Tuy nhiên, tôi nên đề cập đến, tôi đang tìm một cách để làm điều này trong tiêu chuẩn (cơ bản) R ... (vì điều này không phải dành cho tôi).Có cách nào để làm điều đó không? (ngay cả khi nó có liên quan nhiều hơn?) – crs

+1

@crs xem chỉnh sửa của tôi, tôi đã thêm giải pháp cơ sở R. –

+1

Ồ, đẫm máu h, cảm ơn bạn rất nhiều !!!! Điều này là chính xác! Tôi chưa thể bỏ phiếu, nhưng chúc lành cho trái tim của bạn :) – crs

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