编写一个程序来标准化 R 中不均匀表的值

writing a program to normalise values across uneven tables in R

所以让我们拿两个不均匀的桌子

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

所以 df1$normailsed_distance[1] == 0.321。 其中来自 (45/140)

我们可以使用 merge 通过 'year/unique_year' 在 'df1/df2' 中连接两个数据集,并通过创建一个新列 'normalised_distance' 来转换输出数据集,这是'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]

或使用 base R

中的 ave
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))

我会简单地合并这些数据框,然后计算距离:

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