2013-11-14 4 views
8

저는 아직 R에 대해 새 질문을하고 있습니다.요인을 포함하는 여러 열에서 가장 빈번한 값을 찾는 방법

내가 같은 종류가 여러 가지 요인 변수를 포함하는 데이터 세트를 가지고 다음과 같이

내 문제입니다. 나는 요인 변수를 통해 각 관찰에 대해 가장 자주 발생하는 범주를 찾아야합니다. 넥타이의 경우에는 임의의 값을 선택할 수 있습니다. 더 많은 제어권을 가질 수 있다면 좋을 것입니다.

내 데이터 세트에는 100 가지가 넘는 요소가 포함되어 있습니다. 상기 용액은 상기 데이터 프레임 내의 가변되어야

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 

, 각 행의 가장 빈번한 카테고리를 포함 예 VAR5 대한 그러나, 구조는 그런 식이다.

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

상관 조언이 될 것입니다 : 그것은, 내가이 솔루션을하고 싶은이 경우

(데이터가 숫자 벡터 먼저 변환해야 할 경우) 요소 또는 숫자 벡터 일 수있다 매우 감사! 미리 감사드립니다! 추천

답변

13

뭔가 : 경우

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

제 최대 값을 취 which.max 동점있다. which.max 도움말 페이지에서 :

의 위치를 ​​결정하는, 즉, 숫자 벡터의 (제 1) 최소 또는 최대의 인덱스.

예 :

데이터 당신이 data.table 패키지를 사용하여 고려할 수 있습니다 매우 큰 경우
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

내 직업보다 깨끗합니다. 모든 전환, 비공개 등을 건너 뛸 수 있다는 것을 깨닫지 못했습니다. –

+0

이 솔루션을 이용해 주셔서 감사합니다. 난 그냥 내 자신의 데이터에 그것을 시도하고 완벽하게 작동합니다! 너는 나를 위해서 명확히 해줄 수 있을까?이 방법으로 어떻게 관계를 해결할 수 있을까? 감사! – ZMacarozzi

+0

나는 넥타이로 사건을 설명하기 위해 나의 대답을 편집했다. 도움말 페이지 사용 방법을 익히는 것이 좋습니다. 내 솔루션이 도움이 되었기 때문에 기쁩니다. – Chargaff

0

.

# 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)))] 
} 

Chargaff의 솔루션은 간단하고 어떤 경우에는 잘 작동합니다. data.table을 사용하면 작은 성능 향상 (~ 20 %)을 얻을 수 있습니다.

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 
관련 문제