![](/img/trans.png)
[英]Subset dataframe based on levels of a factor and create new variable of quantiles conditional on variable within subset
[英]How to create a normalised rank column based on subset of factor variable?
數據幀樣本:
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"))
我的數據框中有一個“等級”向量,范圍從1到x,具體取決於“年份”中的因子值。 我希望能夠根據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))
我將在一個樹樁上解決該問題,不勝感激-可能還有其他自定義功能?
一種使用dplyr
解決方案可以基於Year
列上的group_by
,然后應用歸一化因子來計算normrank
。
df %>% group_by(Year) %>%
mutate(normrank = (Rank - min(Rank)) / (max(Rank)+min(Rank)) )
# # Groups: Year [3]
# Rank Year normrank
# <dbl> <fctr> <dbl>
# 1 1.00 2001 0
# 2 2.00 2001 0.0556
# 3 3.00 2001 0.111
# 4 4.00 2001 0.167
# 5 5.00 2001 0.222
# 6 6.00 2001 0.278
# 7 7.00 2001 0.333
# 8 8.00 2001 0.389
# 9 9.00 2001 0.444
# 10 10.0 2001 0.500
# # ... with 34 more rows
現在可以在任何Year
上filter
數據了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.