如何获得r中数据帧的比例和计数

时间:2013-07-07 02:01:33

标签: r

我有一个类似下面的数据框,但有更多的行

> df<-data.frame(x1=c(1,1,0,0,1,0),x2=c("a","a","b","a","c","c"))
> df
  x1 x2
1  1  a
2  1  a
3  0  b
4  0  a
5  1  c
6  0  c

df我想要一个数据框,其中行是df$x2的唯一值,col1是与每个字母关联的1的比例,col2是每个字母的计数。所以,我的输出将是

 > getprops(df)
  prop   count
a  .6666   3
b  0       1
c  0.5     2

我可以想到一些精心设计,肮脏的方法来做到这一点,但我正在寻找简短而有效的方法。感谢

5 个答案:

答案 0 :(得分:4)

尝试安装plyr并运行

library(plyr)
df <- data.frame(x1=c(1, 1, 0, 0, 1, 0),
                 label=c("a", "a", "b", "a", "c", "c"))
ddply(df, .(label), summarize, prop = mean(x1), count = length(x1))
#   label      prop count
# 1     a 0.6666667     3
# 2     b 0.0000000     1
# 3     c 0.5000000     2
在引擎盖下的

在基础R中应用与此类似的分割/应用/组合方法:

do.call(rbind, lapply(split(df, df$x2),
                            with, list(prop  = mean(x1),
                                       count = length(x1))))

答案 1 :(得分:4)

我喜欢@ RicardoSaporta的解决方案(+1),但您也可以使用?prop.table

> df<-data.frame(x1=c(1,1,0,0,1,0),x2=c("a","a","b","a","c","c"))
> df
  x1 x2
1  1  a
2  1  a
3  0  b
4  0  a
5  1  c
6  0  c
> tab <- table(df$x2, df$x1)
> tab

    0 1
  a 1 2
  b 1 0
  c 1 1
> ptab <- prop.table(tab, margin=1)
> ptab

            0         1
  a 0.3333333 0.6666667
  b 1.0000000 0.0000000
  c 0.5000000 0.5000000
> dframe <- data.frame(values=rownames(tab), prop=ptab[,2], count=tab[,2])
> dframe
  values      prop count
a      a 0.6666667     2
b      b 0.0000000     0
c      c 0.5000000     1

如果您愿意,可以将它们组合成一个功能:

getprops <- function(values, indicator){
  tab    <- table(values, indicator)
  ptab   <- prop.table(tab, margin=1)
  dframe <- data.frame(values=rownames(tab), prop=ptab[,2], count=tab[,2])
  return(dframe)
}

> getprops(values=df$x2, indicator=df$x2)
  values      prop count
a      a 0.6666667     2
b      b 0.0000000     0
c      c 0.5000000     1

答案 2 :(得分:3)

我不确定这是否符合您的要求。

df<-data.frame(x1=c(1,1,0,0,1,0),x2=c("a","a","b","a","c","c"))

ones <- with(df, aggregate(x1 ~ x2, FUN = sum))
count <- table(df$x2)
prop <- ones$x1 / count

df2 <- data.frame(prop, count)
df2

rownames(df2) <- df2[,3]
df2 <- df2[,c(2,4)]
colnames(df2) <- c('prop', 'count')
df2

       prop count
a 0.6666667     3
b 0.0000000     1
c 0.5000000     2

答案 3 :(得分:3)

以下是data.table中的单行:

> DT[, list(props=sum(x1) / .N, count=.N), by=x2]
   x2     props count
1:  a 0.6666667     3
2:  b 0.0000000     1
3:  c 0.5000000     2


其中DT <- data.table(df)

答案 4 :(得分:2)

尝试使用table

tbl <- table(df$x1, df$x2)  
#    a b c
#  0 1 1 1
#  1 2 0 1


tbl["1",] / colSums(tbl)
#          a         b         c 
#  0.6666667 0.0000000 0.5000000 

为了获得良好的输出:

data.frame(proportions=tbl["1",] / colSums(tbl))
  proportions
a   0.6666667
b   0.0000000
c   0.5000000