2010-07-17 20 views
7

Câu hỏi hiệu suất cơ bản khá từ một người mới sử dụng R. Tôi muốn gán một ID nhóm cho mỗi hàng trong một khung dữ liệu bởi các kết hợp trường duy nhất. Dưới đây là cách tiếp cận hiện tại của tôi:Chỉ định ID nhóm với ddply

> # An example data frame 
> df <- data.frame(name=c("Anne", "Bob", "Chris", "Dan", "Erin"), 
        st.num=c("101", "102", "105", "102", "150"), 
        st.name=c("Main", "Elm", "Park", "Elm", "Main")) 
> df 
    name st.num st.name 
1 Anne 101 Main 
2 Bob 102  Elm 
3 Chris 105 Park 
4 Dan 102  Elm 
5 Erin 150 Main 
> 
> # A function to generate a random string 
> getString <- function(size=10) return(paste(sample(c(0:9, LETTERS, letters), size, replace=TRUE), collapse='')) 
> 
> # Assign a random string for each unique street number + street name combination 
> df <- ddply(df, 
       c("st.num", "st.name"), 
       function(x) transform(x, household=getString())) 
> df 
    name st.num st.name household 
1 Anne 101 Main 1EZWm4BQel 
2 Bob 102  Elm xNaeuo50NS 
3 Dan 102  Elm xNaeuo50NS 
4 Chris 105 Park Ju1NZfWlva 
5 Erin 150 Main G2gKAMZ1cU 

Trong khi điều này hoạt động tốt cho khung dữ liệu với tương đối ít hàng hoặc một số ít nhóm, tôi chạy vào vấn đề hiệu suất với các tập dữ liệu lớn hơn (> 100.000 hàng) có nhiều nhóm độc đáo.

Bất kỳ đề xuất nào để cải thiện tốc độ của tác vụ này? Có thể với idata.frame thử nghiệm của plyr()? Hoặc tôi đang đi về điều này tất cả các sai?

Cảm ơn trước sự giúp đỡ của bạn.

Trả lời

14

Hãy thử sử dụng id chức năng (còn trong plyr):

df$id <- id(df[c("st.num", "st.name")], drop = TRUE) 

Cập nhật:

Chức năng id được coi là bị phản đối kể từ phiên bản dplyr 0,5.0. Chức năng group_indices cung cấp chức năng tương tự.

+0

Dường như tôi cần quay lại và đọc tài liệu hướng dẫn cẩn thận hơn - đây chính là điều tôi đang tìm kiếm. Tôi đã đánh giá giải pháp này và dữ liệu của JoFrhwld trên tập dữ liệu thử nghiệm của tôi: một khung dữ liệu với 164.961 quan sát và 91.876 nhóm duy nhất dựa trên 3 biến nhóm. Tôi đã sử dụng từng phương pháp này để gán biến nhóm ID 100 lần. Thời gian trôi qua trung bình của id() là .958 (sd .0310). Thời gian đã trôi qua trung bình để dán các trường nhóm là 1,94 (sd .0946). Nhờ cả hai! – danpelota

2

Có cần thiết ID là chuỗi ký tự ngẫu nhiên 10 không? Nếu không, tại sao không chỉ dán các cột của khung dữ liệu lại với nhau. Nếu ID phải có cùng độ dài bằng ký tự, chuyển đổi yếu tố để số, sau đó dán chúng lại với nhau:

df$ID <- paste(as.numeric(df$st.num), as.numeric(df$st.name), sep = "") 

Sau đó, nếu bạn thực sự cần phải có 10 ID nhân vật, tôi muốn tạo ra chỉ số n của các ID , và đổi tên các mức ID với họ

df$ID <- as.factor(df$ID) 
n <- nlevels(df$ID) 

getID <- function(n, size=10){ 
    out <- {} 
    for(i in 1:n){ 
    out <- c(paste(sample(c(0:9, LETTERS, letters), size, replace=TRUE), collapse='')) 
    } 
    return(out) 
} 

newLevels <- getID(n = n) 

levels(df$ID) <- newLevels 

Ngoài ra, như một sang một bên, bạn không cần phải sử dụng function(x) với ddply như vậy với transform(). Mã này sẽ chỉ làm việc như nhau:

ddply(df, c("st.num", "st.name"), transform, household=getString()) 
Các vấn đề liên quan