【发布时间】:2018-09-08 23:54:30
【问题描述】:
数据框示例:
df <- structure(list(Rank = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16), Year = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("2001", "2003", "2005", "2007", "2009", "2011", "2013", "2015", "2017"), class = "factor")), .Names = c("Rank", "Year"), row.names = c(NA, -44L), class = c("tbl_df", "tbl", "data.frame"))
我的数据框中有一个“Rank”向量,范围从 1 到 x,具体取决于“Year”中的因子值。我希望能够根据 Year 值对排名进行标准化,并将其放入新列中。
到目前为止,我正在使用这个自定义函数在 0 和 1 之间进行标准化:
range01 <- function(x){(x-min(x))/(max(x)-min(x))}
我创建了一个用 NA 填充的新列。
df$normrank <- NA
然后我尝试使用此方法生成 2001 年的归一化等级,但是这会在子集因子值的每一行中创建新的归一化等级向量的重复副本,而不是在具有相应旧值的行中匹配归一化值。
df$normrank[which(df$Year==2001)] <- range01(subset(df, Year == 2001, select=Rank))
我不知道如何解决这个问题,如果有任何帮助 - 可能是另一个自定义函数?
【问题讨论】:
标签: r function normalization