2015-01-06 42 views
5

Tạo dữ liệu mẫu:Buộc một cột của danh sách vào một chuỗi trong một khung R dữ liệu

id <- c(12, 32, 42, 42, 52, 52, 67, 67) 
relationship_id <- c(15,1,59,1,61,6,59,1) 
sample.data <- data.frame(id,relationship_id) 

Đối với mỗi id xuất hiện nhiều hơn một lần, nối các relationship_id:

combo <- aggregate(relationship_id ~ id, data = sample.data, paste, sep=",") 
table(combo$relationship_id) 
Error in table(combo$relationship_id) : 
    all arguments must have the same length 

tôi đã tìm ra những gì gây ra lỗi này:

class(combo$relationship_id) 
[1] "list" 

Nhưng khi tôi cố gắng và ép buộc các vector danh sách để một vector nhân vật:

combo["relationship_id"] <- lapply(combo["relationship_id"], as.character) 
> head(combo)  
    id relationship_id 
1 12    15 
2 32    1 
3 42 c("59", "1") 
4 52 c("61", "6") 
5 67 c("59", "1") 

Nó bao gồm cú pháp nối ... Tôi hiểu rằng tôi có thể phân tích đầu ra để có thể sử dụng được, nhưng tại sao điều này lại xảy ra? Có cách nào dễ dàng hơn để làm sạch đầu ra không?

+0

Thay đổi 'sep' thành' collapse' và bạn sẽ có thể thực hiện những gì bạn mong đợi. – A5C1D2H2I1M1N2O1R2T1

+1

Làm việc tốt với câu hỏi có thể tái sản xuất làm câu hỏi đầu tiên của bạn về SO. (+1) – A5C1D2H2I1M1N2O1R2T1

Trả lời

4

Bạn đang cố gắng giải quyết vấn đề sai. Nếu bạn thực sự muốn thu gọn các giá trị đó thành một vectơ ký tự đơn, bạn nên sử dụng collapse = "," thay vì sep.

combo <- aggregate(relationship_id ~ id, data = sample.data, 
        paste, collapse=",") 
table(combo$relationship_id) 
# 
# 1 15 59,1 61,6 
# 1 1 2 1 
+0

Tôi thích 'toString' cho những trường hợp như vậy. –

+0

Tôi tìm thấy 'dán' để minh bạch hơn và được sử dụng rộng rãi hơn, nhưng tôi đoán đó là vấn đề ưu tiên. – A5C1D2H2I1M1N2O1R2T1

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