2016-02-10 2 views
0

Снова я совершенно новый в R и пытаюсь разобраться с проблемой, с которой мне пришлось столкнуться. У меня есть набор данных «DS» с колонке «группы» и «матча» мне нужно рассчитать процент соответствия группы столбцов в каждой группе первая группа будет Вторая группа , третий и т. Д.вычисление процентной группы по группам в столбце R

У меня теперь данные:

>ds 

group col1 col2  match 
001  F  M  FALSE 
001  F  M  FALSE  
001  F  M  FALSE  
002  F  M  FALSE 
002  M  M  TRUE  
003  M  F  FALSE 
003  F  F  TRUE  
003  F  F  TRUE  
003  F  M  FALSE  
004  F  M  FALSE 
005  F  F  TRUE 
005  M  F  FALSE  
005  M  M  TRUE  
006  M  M  TRUE   
006  F  M  FALSE 
006  F  M  FALSE 
006  F  M  FALSE 
006  F  M  FALSE 
006  F  F  TRUE 
006  F  M  FALSE 
006  F  M  FALSE 



Desired result: 


group | col1 | col2 | match | mismatch % | Match % 
001  F  M  FALSE  1.0   0  
001  F  M  FALSE  
001  F  M  FALSE  
002  F  M  FALSE  0.50  0.50 
002  M  M  TRUE  
003  M  F  FALSE  0.50  0.50 
003  F  F  TRUE  
003  F  F  TRUE  
003  F  M  FALSE  
004  F  M  FALSE  1.0  0 
005  F  F  TRUE   0.66  0.33 
005  M  F  FALSE  
005  M  M  TRUE  
006  M  M  TRUE   
006  F  M  FALSE  0.75  0.25 
006  F  M  FALSE 
006  F  M  FALSE 
006  F  M  FALSE 
006  F  F  TRUE 
006  F  M  FALSE 
006  F  M  FALSE 

Я знаю, как вычислить, если для всего столбца:

percentage <- table(ds$match) 
cbind(percentage,prop.table(percentage)) 

, но не может принять его для моего решения, показанного выше

Спасибо

+1

Вы просто хотите 'prop.table (таблица (DS $ группу, Д.С. $ MATCH), 1)'? – thelatemail

+0

Hi theletemail, спасибо за ваш ответ, похоже, ваше решение действительно вычисляет процент по группам для сопоставления столбцов, но вопрос: как сделать это так, как это нужно в нужном формате? – Zaza

+0

Вы можете сделать что-то вроде 'ds $ match_per <- with (ds, ave (match, group, FUN = function (x) c (sum (x)/length (x), rep (NA, length (x) -1)))) ', но это кажется немного расточительным, чтобы иметь все пустые ячейки. – thelatemail

ответ

3

Это был бы один из способов сделать это с помощью dplyr

Мы можем воспользоваться двумя вещами здесь: у вас есть столбец с истинными/ложными значениями и тот факт, что количество несоответствий, которое у вас есть, составляет всего 1 минус пропорция совпадений.

library(dplyr) 
# test data 
data <- data.frame(group = factor(c(1,1,1,2,2)), col1 = c(1,1,1,1,0), col2 = c(0,0,0,0,0), 
       match = c(F,F,F,F,T)) 

# group by group, then sum the T/F vector and divide by the number of data 
# points per group 
desired <- data %>% group_by(group) %>% summarise(Match_per = sum(match)/length(match)) 

# the mismatch is 1 minus the match 
desired$Mismatch <- 1 - desired$Match 

data$Match_percent <- NA 
data$Mismatch_percent <- NA 
data[which(duplicated(data$group) == FALSE), 
which(colnames(data) %in%c("Match_percent", 
    "Mismatch_percent"))] <- desired[,=1] 

выход

group col1 col2 match Match_percent Mismatch_percent 
1  1 1 0 FALSE   0.0    1.0 
2  1 1 0 FALSE   NA    NA 
3  1 1 0 FALSE   NA    NA 
4  2 1 0 FALSE   0.5    0.5 
5  2 0 0 TRUE   NA    NA 
+0

Спасибо за ваш ответ M_Fido, извините, я могу задать глупый вопрос, но :) как именно я должен использовать это решение, чтобы создать что-то вроде показанного в желаемом результате и сохранить это конкретный формат? для простой группы для группового расчета это тоже работает: prop.table (таблица (ds $ group, ds $ match), 1) – Zaza

+0

Я обновил код, чтобы сохранить тот формат, который вам нужен. –

+0

M_Fidino thanks, great solution – Zaza

Смежные вопросы