使用mutate和group_by在行上滚动操作

时间:2018-09-29 14:17:42

标签: r dplyr

我有以下数据:

country       year  sales
--------------------------
Afghanistan   1950   30
Afghanistan   1951   35
Albania       1950    0
Albania       1951    5
total         1950   30
total         1951   40

我想生成一个新的列,比率,即任何给定的国家/地区年组合的销售额与该年总销售额的比率。因此输出应为:

country       year  sales  ratio
---------------------------------
Afghanistan   1950   30     1
Afghanistan   1951   35     0.875
Albania       1950    0     0
Albania       1951    5     0.125
total         1950   30     1
total         1951   40     1

我想使用tidyverse(我是新手)来完成此操作,但是对于如何使用mutate和group_by来完成此操作,我仍然有些困惑(即使那是最好的方法)一般而言)。

我尝试使用this thread中给出的建议失败。我尝试过的是:

library(tidyverse)
df <- df %>%
group_by(year) %>%
mutate(ratio = sales[country]/sales[country == "total"])

但这会生成一列称为NA满的比率。我是否需要使用循环或其他方法?我对R有点陌生,我承认直到现在我还避免了循环。查看循环文档,我想不出如何使用它来遍历每个国家/年份的组合并生成新的列。

1 个答案:

答案 0 :(得分:4)

您可以按国家/地区分组,然后将销售额除以最高销售额-我想是private String acc; public void setAcc(String a) { this.acc = a; m_acc.setText(a); } ... System.out.println(acc); //prints the value of a

total

library(dplyr) df %>% group_by(year) %>% mutate(ratio = sales / max(sales)) # A tibble: 6 x 4 # Groups: year [2] # country year sales ratio # <chr> <int> <int> <dbl> #1 Afghanistan 1950 30 1 #2 Afghanistan 1951 35 0.875 #3 Albania 1950 0 0 #4 Albania 1951 5 0.125 #5 total 1950 30 1 #6 total 1951 40 1

base R

或与transform(df, ratio = ave(sales, year, FUN = function(x) x / max(x)))

data.table

数据

library(data.table)
setDT(df)[, ratio := sales / max(sales), by = year][]