2015-05-25 3 views
3

Для образца dataframe:Дайте процент группой в R

df1 <- structure(list(i.d = structure(1:9, .Label = c("a", "b", "c", 
                "d", "e", "f", "g", "h", "i"), class = "factor"), group = c(1L, 
                               1L, 2L, 1L, 3L, 3L, 2L, 2L, 1L), cat = c(0L, 0L, 1L, 1L, 0L, 
                                         0L, 1L, 0L, NA)), .Names = c("i.d", "group", "cat"), class = "data.frame", row.names = c(NA, 
                                                               -9L)) 

Я хотел бы добавить дополнительный столбец к моей dataframe («pc.cat»), который записывает процентное «1s» в колонке кота за групповой идентификатор.

Например, в группе 1 есть четыре значения (i, d, a, b, d и i). Значение «i» равно NA, поэтому на данный момент это можно игнорировать. Осталось только одно из трех значений, поэтому процент будет читать 33.33 (до 2 dp). Это значение будет заполнено в столбце «pc.cat» рядом со всеми строками с «1» в группе (даже столбцами NA). Затем этот процесс повторяется для других групп (2 и 3).

Если бы кто-нибудь мог мне помочь с кодом для этого, я был бы очень признателен.

ответ

2

Это может быть достигнуто с помощью ave функции:

df1$pc.cat <- ave(df1$cat, df1$group, FUN=function(x) 100*mean(na.omit(x))) 
df1 
# i.d group cat pc.cat 
# 1 a  1 0 33.33333 
# 2 b  1 0 33.33333 
# 3 c  2 1 66.66667 
# 4 d  1 1 33.33333 
# 5 e  3 0 0.00000 
# 6 f  3 0 0.00000 
# 7 g  2 1 66.66667 
# 8 h  2 0 66.66667 
# 9 i  1 NA 33.33333 
1

С data.table:

library(data.table) 
DT <- data.table(df1) 
DT[, list(sum(na.omit(cat))/length(cat)), by = "group"] 
2
library(data.table) 

setDT(df1) 


df1[!is.na(cat), mean(cat), by=group] 
Смежные вопросы