我有以下数据:
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有点陌生,我承认直到现在我还避免了循环。查看循环文档,我想不出如何使用它来遍历每个国家/年份的组合并生成新的列。
答案 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][]