首页 > 解决方案 > 查找共享一个共同水平的两个水平的值的比例

问题描述

我有一个看起来像这样的数据框:

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)
}

标签: r

解决方案


这是一个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 / bgather从宽到长的数据,然后重新排序行以重现您的预期输出。


推荐阅读