r - 查找共享一个共同水平的两个水平的值的比例
问题描述
我有一个看起来像这样的数据框:
group <- c('a', 'b', 'a', 'b')
year <- c(1990, 1990, 2000, 2000)
freq <- c(100, 120, 130, 170)
df <- data.frame(group, year, freq)
对于每个不同的年份,我想找到具有组的行a
的频率值除以具有组的行的频率值b
,并将这些比例值添加到数据框中。生成的数据框应如下所示:
group <- c('a', 'b', 'c', 'a', 'b', 'c')
year <- c(1990, 1990, 1990, 2000, 2000, 2000)
freq <- c(100, 120, 100/120, 130, 170, 130/170)
df <- data.frame(group, year, freq)
我试图用下面最丑陋的环来解决这个问题,但已经把火车从铁轨上取下来了。如果有人可以帮助我展示如何在 R 中完成这项基本任务,我将不胜感激!
for (year in unique(df$year)) {
a = df[ which(df$group == 'a' & df$year == year), ]
b = df[ which(df$group == 'b' & df$year == year), ]
proportion = a$freq / b$freq
row = c('c', year, proportion)
rbind(df, row)
}
解决方案
这是一个tidyverse
选项
library(tidyverse)
df %>%
spread(group, freq) %>%
mutate(c = a / b) %>%
gather(group, freq, -year) %>%
arrange(year, group)
# year group freq
#1 1990 a 100.0000000
#2 1990 b 120.0000000
#3 1990 c 0.8333333
#4 2000 a 130.0000000
#5 2000 b 170.0000000
#6 2000 c 0.7647059
说明:我们spread
从长到宽的数据,添加一列c = a / b
和gather
从宽到长的数据,然后重新排序行以重现您的预期输出。
推荐阅读
- loops - 如何在rust中的每个循环中继续迭代下一个字符
- python - UnboundLocalError:局部变量python
- cloudinary - Cloudinary - Iframe 关闭按钮 + 源栏被隐藏,因为 Iframe 内容太高
- jquery - 在jQuery中暂停音频之前添加延迟
- python - 在不使用虚拟环境的情况下使用 miniconda/anaconda?
- javascript - 我是否正确嵌套了函数?
- git - 如何告诉 Git Clone 不要运行我的 .bashrc?
- python - 如何从pyserialtransfer的数字列表中重建python中的结构
- css - 定义标题高度
- ios - 如何使用 Firebase 数据创建和填充 SwiftUI 列表?