2013-02-22 37 views
7

Tôi cần phải sắp xếp lại dữ liệu từ tệp csv chứa phần lớn dữ liệu lặp lại. Tôi có dữ liệu nhập khẩu vào R trong một dataframe nhưng tôi đang gặp khó khăn với những điều sau:Sắp xếp lại dữ liệu từ 3 hàng đến 1

ID Language Author Keyword 
12 eng  Rob  COLOR=Red 
12 eng  Rob  SIZE=Large 
12 eng  Rob  DD=1 
15 eng  John  COLOR=Red 
15 eng  John  SIZE=Medium 
15 eng  John  DD=2 

Những gì tôi cần làm là chuyển đổi này vào một hàng với mỗi từ khóa trong một cột riêng

ID Language Author COLOR SIZE  DD 
12 eng  Rob  Red Large  1 

Bất kỳ ý tưởng nào?

Trả lời

7

Sử dụng gói reshape2 này rất đơn giản:

Với tt định nghĩa là trong Gary's answer

library("reshape2") 

tt <- cbind(tt, colsplit(tt$Keyword, "=", c("Name", "Value"))) 
tt_new <- dcast(tt, ID + Language + Author ~ Name, value.var="Value") 

mang đến cho

> tt_new 
    ID Language Author COLOR DD SIZE 
1 12  eng Rob Red 1 Large 
2 15  eng John Red 2 Medium 
+0

Tôi có thể làm điều này để làm việc nhưng sau khi dcast() chạy tôi nhận được một lỗi nói: Chức năng tập hợp mất tích: mặc định chiều dài. Sau đó tôi nhận được 1 trong mỗi biến mới. Tôi đoán trong tập dữ liệu thực sự phải có cái gì đó không đúng vì nó hoạt động tốt trên bộ dữ liệu được đơn giản hóa này. Bất kỳ ý tưởng? – Ray

+0

Có vẻ như tôi có số bất bình đẳng ở đâu đó. Cần tìm ra cách tìm ID với hơn 3 hàng và dọn sạch nó. – Ray

+0

Bạn sẽ nhận được cảnh báo đó nếu có sự kết hợp của 'ID',' Ngôn ngữ', 'Tác giả' và' Tên' xuất hiện nhiều lần. Bạn có thể biết cái nào là/cái mà họ đang tìm kiếm giá trị khác 1 trong kết quả (về cơ bản, khi có nhiều giá trị cho kết hợp, định dạng lại sẽ tổng hợp chúng thành một giá trị bằng cách nào đó và theo mặc định, bằng cách nào đó chỉ đếm có bao nhiêu). –

6

Sử dụng plyr ans strsplit bạn có thể làm một cái gì đó như thế này:

library(plyr) 
res <- ddply(dat,.(ID,Language,Author),function(x){ 
     unlist(sapply(strsplit(x$Keyword,'='),'[',2)) 
}) 

colnames(res)[4:6] <- c('COLOR','SIZE','DD') 

ID Language Author COLOR SIZE DD 
1 12  eng Rob Red Large 1 
2 15  eng John Red Medium 2 

Edit: Đây là một sự tổng quát mà các địa chỉ @ mối quan tâm của Brian:

res <- ddply(dat,.(ID,Language,Author), function(x){ 
      kv <- strsplit(x$Keyword, '=') 
      setNames(sapply(kv, `[`, 2), 
         sapply(kv, `[`, 1)) }) 
+0

có, đó là đẹp hơn ;-) –

+2

Như là một điểm thận trọng, điều này giả sử rằng từ khóa luôn là 'COLOR',' SIZE' và 'DD' và luôn theo thứ tự đó. Nếu giả định đó là đúng, điều này hoạt động tốt. –

+0

@flodel cảm ơn chỉnh sửa trang nhã. – agstudy

1

Hãy thử này sử dụng reshape2:

tt <- read.table(header=T,text='ID Language Author Keyword 
12 eng  Rob  COLOR=Red 
12 eng  Rob  SIZE=Large 
12 eng  Rob  DD=1 
15 eng  John  COLOR=Red 
15 eng  John  SIZE=Medium 
15 eng  John  DD=2') 

tt$Keyword <- as.character(tt$Keyword) 

tt <- transform(tt, key_val = lapply(tt$Keyword,function(x) strsplit(x,'=')[[1]][2]), 
key_var = lapply(tt$Keyword,function(x) strsplit(x,'=')[[1]][1])) 

tt_new <- dcast (tt, ID + Language + Author ~ key_var, value.var='key_val') 
+0

Bạn có chắc chắn rằng nó hoạt động ..? – agstudy

+0

'lapply' của bạn nên là' sapply' và bạn cần 'value.var =" key_val "' trong lệnh 'dcast' của bạn. –

+0

Đã không nhận ra 'value.var' cần var trong dấu ngoặc kép, vì vậy nó đã cho tôi một lỗi. Tôi đã bỏ nó ra nhưng 'dcast' đoán đúng biến thích hợp trong trường hợp này. Cảm ơn. –

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