所以我们采取两个不平衡的表
year <- c(1999,1999,1998,1997,2000,1999,1998)
distance <- c(45,50,60,40,35,45,40)
df1 <- data.frame(year, distance)
和摘要数据
unique_year <- c(1997,1998,1999,2000)
distance_total <- c(40,100,140,35)
df2 <- data.frame(unique_year, distance_total)
现在我想创建一个新变量df1$normailsed_distance
,它接受distance
值,然后将每个唯一年份的相应distance_total
除以。{/ p>
所以df1$normailsed_distance[1]
== 0.321。
来自(45/140)
答案 0 :(得分:3)
我们可以使用merge
将这两个数据集加入&#39; year / unique_year&#39;在&#39; df1 / df2&#39;并通过创建一个新列&#39; normalised_distance&#39;来转换输出数据集。这是&#39; distance / distance_total`
transform(merge(df1, df2, by.x='year', by.y='unique_year'),
normalised_distance=distance/distance_total)[,-3]
或使用match
df1$normalised_distance <- df1$distance/df2$distance_total[match(df1$year
, df2$unique_year)]
如果您不想比较两个数据集中的列,但要使用相同的数据集,则可以使用标准聚合组选项来完成。
library(data.table)
setDT(df1)[, normalised_distance := distance/sum(distance), year]
或使用ave
base R
df1$normalised_distance <- with(df1, ave(distance, year,
FUN=function(x) x/sum(x)))
或者可以使用dplyr
来完成类似的方法。 @Khashaa已在评论中显示(并删除)。
library(dplyr)
df1 %>%
group_by(year) %>%
mutate(normalised_distance = distance/sum(distance))
答案 1 :(得分:2)
我只需合并这些数据帧然后计算距离:
df <- merge(x = df1, y = df2, by.x = "year", by.y = "unique_year")
df$normalised <- df$distance / df$distance_total
会产生:
> head(df)
year distance distance_total normalised
1 1997 40 40 1.0000000
2 1998 60 100 0.6000000
3 1998 40 100 0.4000000
4 1999 45 140 0.3214286
5 1999 50 140 0.3571429
6 1999 45 140 0.3214286