来自 data.frame 的 R 计数百分比
R percentage of counts from a data.frame
我需要计算变量计数的百分比并将其放入向量中
我的框架如下:
group <- c('A','A','A','B','B','B')
hight <- c('tall','tall','short','tall','short','short')
group hight
A tall
A tall
A short
B tall
B short
B short
如果 运行 table(df) 我得到:
hight
group short tall
A 1 2
B 2 1
计算百分比
t=table(df)
percentages <- data.frame(group=c('A','B'), percent = c(t[1]/(t[1]+t[2]),t[3]/(t[3]+t[4])))
percentages
percent.vector <- c(t[1]/(t[1]+t[2]),t[3]/(t[3]+t[4]))
percent.vector
我得到了我想要的:
group percent
1 A 0.3333333
2 B 0.6666667
[1] 0.3333333 0.6666667
...但我想有更好的方法来做到这一点。我无法对更大范围的组进行此计算。
如何简化百分比的计算?
谢谢
如果我们使用dplyr/tidyr
,获得预期的方法是
library(dplyr)
library(tidyr)
df %>%
count(group, hight) %>%
mutate(percent = n/sum(n)) %>%
select(-n) %>%
spread(hight, percent)
# group short tall
# <fctr> <dbl> <dbl>
#1 A 0.3333333 0.6666667
#2 B 0.6666667 0.3333333
或者正如@JoeRoe 在评论中提到的,我们可以在新版本的 tidyr
中使用 pivot_wider
来替代 spread
...
pivot_wider(names_from = hight, values_from = percent)
数据
df <- data.frame(group, hight)
使用旧 base-r
的解决方案
x = data.frame(group = c('A','A','A','B','B','B'),
hight = c('tall','tall','short','tall','short','short'))
prop.table(table(x)[,1])
# A B
#0.3333333 0.6666667
prop.table(table(x)[,2])
# A B
#0.6666667 0.3333333
要提取数字,只需使用 table(x)[,1]
中的索引
我需要计算变量计数的百分比并将其放入向量中
我的框架如下:
group <- c('A','A','A','B','B','B')
hight <- c('tall','tall','short','tall','short','short')
group hight
A tall
A tall
A short
B tall
B short
B short
如果 运行 table(df) 我得到:
hight
group short tall
A 1 2
B 2 1
计算百分比
t=table(df)
percentages <- data.frame(group=c('A','B'), percent = c(t[1]/(t[1]+t[2]),t[3]/(t[3]+t[4])))
percentages
percent.vector <- c(t[1]/(t[1]+t[2]),t[3]/(t[3]+t[4]))
percent.vector
我得到了我想要的:
group percent
1 A 0.3333333
2 B 0.6666667
[1] 0.3333333 0.6666667
...但我想有更好的方法来做到这一点。我无法对更大范围的组进行此计算。
如何简化百分比的计算?
谢谢
如果我们使用dplyr/tidyr
,获得预期的方法是
library(dplyr)
library(tidyr)
df %>%
count(group, hight) %>%
mutate(percent = n/sum(n)) %>%
select(-n) %>%
spread(hight, percent)
# group short tall
# <fctr> <dbl> <dbl>
#1 A 0.3333333 0.6666667
#2 B 0.6666667 0.3333333
或者正如@JoeRoe 在评论中提到的,我们可以在新版本的 tidyr
中使用 pivot_wider
来替代 spread
...
pivot_wider(names_from = hight, values_from = percent)
数据
df <- data.frame(group, hight)
使用旧 base-r
x = data.frame(group = c('A','A','A','B','B','B'),
hight = c('tall','tall','short','tall','short','short'))
prop.table(table(x)[,1])
# A B
#0.3333333 0.6666667
prop.table(table(x)[,2])
# A B
#0.6666667 0.3333333
要提取数字,只需使用 table(x)[,1]