7

以下のようなデータ フレームがありますが、より多くの行があります。

> 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

行が一意の値であり、col1 が各文字に関連付けられた 1 の割合であり、col2 が各文字の数でdfあるデータ フレームが必要です。df$x2だから、私の出力は

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

これを行うための精巧で汚い方法をいくつか考えることができますが、短くて効率的な方法を探しています。ありがとう

4

5 に答える 5

6

@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

必要に応じて、これを 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
于 2013-07-07T04:23:16.517 に答える
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))))
于 2013-07-07T02:05:47.757 に答える
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
于 2013-07-07T02:28:06.277 に答える
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
于 2013-07-07T02:32:48.163 に答える