编写一个程序来标准化 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
所以让我们拿两个不均匀的桌子
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