2013-11-14 16 views
8

Tôi vẫn còn tương đối mới đối với R, vì vậy xin lỗi trước nếu câu hỏi của tôi có vẻ quá cơ bản.Cách tìm các giá trị thường xuyên nhất trên một số cột có chứa các yếu tố

Sự cố của tôi như sau:

Tôi có tập dữ liệu chứa nhiều biến yếu tố có cùng danh mục. Tôi cần phải tìm loại, xảy ra thường xuyên nhất cho mỗi quan sát trên các biến yếu tố. Trong trường hợp quan hệ một giá trị tùy ý có thể được chọn, mặc dù nó sẽ là tuyệt vời nếu tôi có thể kiểm soát nhiều hơn nó.

Tập dữ liệu của tôi chứa hơn một trăm yếu tố. Tuy nhiên, cấu trúc giống như vậy:

id <- 1:3 
var1 <- c("red","yellow","green") 
var2 <- c("red","yellow","green") 
var3 <- c("yellow","orange","green") 
var4 <- c("orange","green","yellow") 
df <- data.frame(cbind(id, var1, var2, var3, var4)) 


> df 
    id var1 var2 var3 var4 
1 1 red red yellow orange 
2 2 yellow yellow orange green 
3 3 green green green yellow 

Giải pháp phải là biến trong khung dữ liệu, ví dụ var5, chứa danh mục thường xuyên nhất cho mỗi hàng. Nó có thể là một yếu tố hoặc một vector số (trong trường hợp các dữ liệu cần phải được chuyển đổi đầu tiên vectơ số)

Trong trường hợp này, tôi muốn có giải pháp này:

> df$var5 
[1] "red" "yellow" "green" 

Bất cứ lời khuyên sẽ Nhiều đánh giá cao! Cảm ơn trước!

Trả lời

13

Cái gì như:

apply(df,1,function(x) names(which.max(table(x)))) 
[1] "red" "yellow" "green" 

Trong trường hợp có một cà vạt, which.max mất giá trị max đầu tiên. Từ trang giúp đỡ which.max:

Xác định vị trí, ví dụ, chỉ số của (đầu tiên) tối thiểu hoặc tối đa của một vector số.

Ex:

var4 <- c("yellow","green","yellow") 
df <- data.frame(cbind(id, var1, var2, var3, var4)) 

> df 
    id var1 var2 var3 var4 
1 1 red red yellow yellow 
2 2 yellow yellow orange green 
3 3 green green green yellow 

apply(df,1,function(x) names(which.max(table(x)))) 
[1] "red" "yellow" "green" 
+0

công việc tốt đẹp, sạch hơn tôi. Đã không nhận ra rằng tôi có thể bỏ qua tất cả các chuyển đổi, không công bố, v.v. –

+0

Cảm ơn bạn rất nhiều vì giải pháp này. Tôi chỉ thử nó trên dữ liệu của riêng tôi và nó hoạt động hoàn hảo! Bạn có thể, xin vui lòng, chỉ cần làm rõ cho tôi, làm thế nào để phương pháp này giải quyết quan hệ? Cảm ơn! – ZMacarozzi

+0

Tôi đã chỉnh sửa câu trả lời của mình để minh họa trường hợp bằng cà vạt. Đó là thói quen tốt để tìm hiểu cách sử dụng các trang trợ giúp. Tôi vui vì giải pháp của tôi đã làm việc cho bạn. – Chargaff

0

Nếu dữ liệu của bạn là khá lớn, bạn có thể muốn xem xét sử dụng gói data.table.

# Generate the data 
nrow <- 10^5 
id <- 1:nrow 
colors <- c("red","yellow","green") 
var1 <- sample(colors, nrow, replace = TRUE) 
var2 <- sample(colors, nrow, replace = TRUE) 
var3 <- sample(colors, nrow, replace = TRUE) 
var4 <- sample(colors, nrow, replace = TRUE) 

Mode <- function(x) { 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 

giải pháp Chargaff là đơn giản và hoạt động tốt trong một số trường hợp. Bạn có thể đạt được một cải tiến hiệu suất nhỏ (~ 20%) bằng cách sử dụng data.table.

df <- data.frame(cbind(id, var1, var2, var3, var4)) 
system.time(apply(df, 1, Mode)) 
# user system elapsed 
# 1.242 0.018 1.264 

library(data.table) 
dt <- data.table(cbind(id, var1, var2, var3, var4)) 
system.time(melt(dt, measure = patterns('var'))[, Mode(value1), by = id]) 
# user system elapsed 
# 1.020 0.012 1.034 
Các vấn đề liên quan