gpt4 book ai didi

r - 如何获得边际比例的双向表?

转载 作者:行者123 更新时间:2023-12-03 23:39:56 24 4
gpt4 key购买 nike

考虑一下

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

我想得到一个 var1var2 之间的双向表。

我可以使用

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

var1 A B F G
* <fctr> <dbl> <dbl> <dbl> <dbl>
1 A 0 0 0 1
2 B 0 1 0 0
3 C 0 1 1 0
4 G 1 0 0 0

或使用 table

> 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

两者都给出相同的结果。但现在假设我对行或列的比例感兴趣。我可以在这里再次使用 table

> 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

另外,在 prop.table 中使用 margin 会失败。

> df %>%  count(var1,var2) %>% mutate(prop = prop.table(n ,margin =1)) %>% spread(var2, prop, fill = 0)
Error in eval(substitute(expr), envir, enclos) : 'x' is not an array

谢谢!

最佳答案

管道实际上是一个 magrittr 而不是 dplyr 的东西:

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

关于r - 如何获得边际比例的双向表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40266062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com