2016-05-04 1 views
1

У меня есть кадр данных, как это:частоты оценки для нескольких подмножеств кадра данных в R

df<-data.frame(fac1=rep(c("a","b","c"),3),fac2=c(rep("x",3),rep("y",3),rep("z",3)),val=seq(10,90,10)) 

То, что я хотел бы сделать, это вычислить частоту для каждого уровня fac1 в данных fac2.

Я не использовал «для петли» много, но я думал, что что-то, как это будет сделать это:

df$freqs<-for(i in unique(df$fac2)) df$val/sum(df$val) 

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

+0

Вам нужна библиотека (data.table), setDT (df) [, val/sum (val), fac2] ' – akrun

ответ

0

Мы можем использовать data.table

library(data.table) 
setDT(df)[, freq:= val/sum(val) , by = fac2] 
df 
# fac1 fac2 val  freq 
#1: a x 10 0.1666667 
#2: b x 20 0.3333333 
#3: c x 30 0.5000000 
#4: a y 40 0.2666667 
#5: b y 50 0.3333333 
#6: c y 60 0.4000000 
#7: a z 70 0.2916667 
#8: b z 80 0.3333333 
#9: c z 90 0.3750000 

Или с помощью base R

df$freq <- with(df, val/ave(val, fac2, FUN=sum)) 
+1

Спасибо @akrun. Я не знал библиотеку data.table, но выглядел очень полезным – ricardo

0

С библиотекой dpyr, вы можете попробовать что-то вроде этого:

library(dplyr) 
df %>% 
    group_by(fac2) %>% 
    mutate(freqs = val/sum(val)) 

Source: local data frame [9 x 4] 
Groups: fac2 [3] 

    fac1 fac2 val  freqs 
    <fctr> <fctr> <dbl>  <dbl> 
1  a  x 10 0.1666667 
2  b  x 20 0.3333333 
3  c  x 30 0.5000000 
4  a  y 40 0.2666667 
5  b  y 50 0.3333333 
6  c  y 60 0.4000000 
7  a  z 70 0.2916667 
8  b  z 80 0.3333333 
9  c  z 90 0.3750000 

Это то, что вы хотите?

+0

спасибо @Gopala, это было очень полезно. просто отметим, что после запуска этого кода и если вам нужен фрейм данных, тогда вам нужно выполнить 'df <-as.data.frame (df)' – ricardo