编写程序来规范R中不均匀表中的值

时间:2015-07-28 11:05:00

标签: r dataframe normalization

所以我们采取两个不平衡的表

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)

2 个答案:

答案 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