dplyr:如何获得具有边际比例的双向表?

dplyr:如何获得具有边际比例的双向表?,r,dplyr,R,Dplyr,想想这个 var1<- c('A','B','C','C','G') var2<- c('G','B','B','F','A') df = df=data.frame(var1,var2) > df var1 var2 1 A G 2 B B 3 C B 4 C F 5 G A 或使用表格 > table( df$var1, df$var2) A B F G A 0 0 0 1 B 0

想想这个

var1<- c('A','B','C','C','G')
var2<- c('G','B','B','F','A')
df = df=data.frame(var1,var2)

> df
  var1 var2
1    A    G
2    B    B
3    C    B
4    C    F
5    G    A
或使用
表格

> table( df$var1, df$var2)

    A B F G
  A 0 0 0 1
  B 0 1 0 0
  C 0 1 1 0
  G 1 0 0 0
两者的结果相同。但是现在假设我对行或列的比例感兴趣。我可以在这里再次使用
表格

> prop.table(table( df$var1, df$var2), margin =2) # for column

      A   B   F   G
  A 0.0 0.0 0.0 1.0
  B 0.0 0.5 0.0 0.0
  C 0.0 0.5 1.0 0.0
  G 1.0 0.0 0.0 0.0

> prop.table(table( df$var1, df$var2), margin =1) # for rows

      A   B   F   G
  A 0.0 0.0 0.0 1.0
  B 0.0 1.0 0.0 0.0
  C 0.0 0.5 0.5 0.0
  G 1.0 0.0 0.0 0.0
如何使用
dplyr
(最短语法)重现这些内容

下面的解决方案似乎有效(仅在一种情况下),尽管我不明白为什么:
prop.table(n)
函数在这里做什么

> df %>%  count(var1,var2) %>% mutate(prop = prop.table(n)) %>% spread(var2, prop, fill = 0)
Source: local data frame [4 x 6]
Groups: var1 [4]

    var1     n     A     B     F     G
* <fctr> <int> <dbl> <dbl> <dbl> <dbl>
1      A     1     0   0.0   0.0     1
2      B     1     0   1.0   0.0     0
3      C     1     0   0.5   0.5     0
4      G     1     1   0.0   0.0     0

谢谢

您可以使用
group\u by
模拟所需的边距,然后将每个计数除以组中的计数总和(注意,删除列
n
,以避免
排列时出现问题):

给予


管道实际上是一个magrittr,而不是dplyr:

df %>% with(table(var1, var2)) %>% prop.table(margin=2)

您也可以在
count
中反转变量:

res1 <- df %>% count(var1,var2) %>% 
               mutate(prop = prop.table(n)) %>% spread(var2, prop, fill = 0)
##Source: local data frame [4 x 6]
##Groups: var1 [4]
##
##    var1     n     A     B     F     G
##* <fctr> <int> <dbl> <dbl> <dbl> <dbl>
##1      A     1     0   0.0   0.0     1
##2      B     1     0   1.0   0.0     0
##3      C     1     0   0.5   0.5     0
##4      G     1     1   0.0   0.0     0
res2 <- df %>% count(var2,var1) %>% 
               mutate(prop = prop.table(n)) %>% spread(var2, prop, fill = 0)
### A tibble: 4 x 6
##    var1     n     A     B     F     G
##* <fctr> <int> <dbl> <dbl> <dbl> <dbl>
##1      A     1     0   0.0     0     1
##2      B     1     0   0.5     0     0
##3      C     1     0   0.5     1     0
##4      G     1     1   0.0     0     0

可能会看到,并且。
df%>%janitor::交叉表(var1,var2,percent='row')
@alistaire疯狂包!它坚固可靠吗?它很新,但构造很坚固,因为它专注于狭隘的任务。到目前为止,这只让我很高兴。好的接球伙伴,非常好如果你全力以赴的话,你可以做
df%$%table(var1,var2)%%>%prop.table(margin=2)
(或者只是
df%>%table()%%>%prop.table(margin=2)
。我认为问题在于你最终得到的是一个表,而不是一个data.frame,但是。首先给出一个完全有效的解决方案。我必须把它给你,伙计如果你把
var2
放在
count
的第一位,你可以跳过
组<代码>总结
/
计数
取消最后添加的组的分组。谢谢,我希望我能准确地告诉你
道具表
在这里做了什么,但是如果你看
str(df%>%count(var1,var2))
vs
str(df%>%count(var2,var1))
您会注意到它是一个
分组的_df
,分组是通过属性
vars
进行的,在第一种情况下是
var1
,在第二种情况下是
var2
。对
prop.table
的后续调用必须使用它来确定边距表,这类似于Mark Peterson的解决方案。当传递一个向量时,
prop.table
只需将每个元素除以和,因此相当于
n/sum(n)
@alistaire:谢谢,很高兴知道。因此,因为
count(var2,var1)
的输出实际上是按照
count
的第一个输入分组的,所以我们通过该变量得到了边距?
df %>%
  count(var1,var2) %>%
  group_by(var2) %>%
  mutate(prop = n / sum(n)) %>%
  select(-n) %>%
  spread(var2, prop, fill = 0)
    var1     A     B     F     G
1      A     0   0.0     0     1
2      B     0   0.5     0     0
3      C     0   0.5     1     0
4      G     1   0.0     0     0
df %>% with(table(var1, var2)) %>% prop.table(margin=2)
res1 <- df %>% count(var1,var2) %>% 
               mutate(prop = prop.table(n)) %>% spread(var2, prop, fill = 0)
##Source: local data frame [4 x 6]
##Groups: var1 [4]
##
##    var1     n     A     B     F     G
##* <fctr> <int> <dbl> <dbl> <dbl> <dbl>
##1      A     1     0   0.0   0.0     1
##2      B     1     0   1.0   0.0     0
##3      C     1     0   0.5   0.5     0
##4      G     1     1   0.0   0.0     0
res2 <- df %>% count(var2,var1) %>% 
               mutate(prop = prop.table(n)) %>% spread(var2, prop, fill = 0)
### A tibble: 4 x 6
##    var1     n     A     B     F     G
##* <fctr> <int> <dbl> <dbl> <dbl> <dbl>
##1      A     1     0   0.0     0     1
##2      B     1     0   0.5     0     0
##3      C     1     0   0.5     1     0
##4      G     1     1   0.0     0     0
df %>% count(var1,var2) %>% mutate(prop = prop.table(n))
Source: local data frame [5 x 4]
Groups: var1 [4]  ## Note: grouped by var1

    var1   var2     n  prop
  <fctr> <fctr> <int> <dbl>
1      A      G     1   1.0
2      B      B     1   1.0
3      C      B     1   0.5
4      C      F     1   0.5
5      G      A     1   1.0

df %>% count(var2,var1) %>% mutate(prop = prop.table(n))
Source: local data frame [5 x 4]
Groups: var2 [4]  ## Note: grouped by var2

    var2   var1     n  prop
  <fctr> <fctr> <int> <dbl>
1      A      G     1   1.0
2      B      B     1   0.5
3      B      C     1   0.5
4      F      C     1   1.0
5      G      A     1   1.0