R:列组变化时增加Rank
R: Increment Rank when the column group changes
R 新手,我试过谷歌搜索,但找不到解决方案。
这是我的数据框:
Name Value
Bob 50
Mary 55
John 51
Todd 50
Linda 56
Tom 55
所以我已经对它进行了排序,但是我需要添加一个排名列,所以它看起来像这样:
Name Value Rank
Bob 50 1
Todd 50 1
John 51 2
Mary 55 3
Tom 55 3
Linda 56 4
所以我发现的是:
resultset$Rank <- ave(resultset$Name, resultset$Value, FUN = rank)
但这给了我:
Name Value Rank
Bob 50 1
Todd 50 2
John 51 1
Mary 55 1
Tom 55 2
Linda 56 1
这么近但又那么远...
无需排序...您可以使用 dense_rank
from "dplyr":
> library(dplyr)
> mydf %>% mutate(rank = dense_rank(Value))
Name Value rank
1 Bob 50 1
2 Mary 55 3
3 John 51 2
4 Todd 50 1
5 Linda 56 4
6 Tom 55 3
我猜你的排名变量可以通过1:length(unique(df$value))
获得。下面是我的试用。
df <- data.frame(name = c("Bob", "Mary", "John", "Todd", "Linda", "Tom"),
value = c(50, 55, 51, 50, 56, 55))
# rank by lengths of unique values
rank <- data.frame(rank = 1:length(unique(df$value)), value = sort(unique(df$value)))
merge(df, rank, by="value")
value name rank
1 50 Bob 1
2 50 Todd 1
3 51 John 2
4 55 Mary 3
5 55 Tom 3
6 56 Linda 4
这是一个 base-R 解决方案:
uv <- unique(df$Value)
merge(df,data.frame(uv,r=rank(uv)),by.x="Value",by.y="uv")
这给出了
Value Name r
1 50 Bob 1
2 50 Todd 1
3 51 John 2
4 55 Mary 3
5 55 Tom 3
6 56 Linda 4
这是内存效率低下的做法,并且会产生重新使用数据的副作用。您也可以这样做:
require(data.table)
DT <- data.table(df)
DT[order(Value),r:=.GRP,by=Value]
这给出了
Name Value r
1: Bob 50 1
2: Mary 55 3
3: John 51 2
4: Todd 50 1
5: Linda 56 4
6: Tom 55 3
R 新手,我试过谷歌搜索,但找不到解决方案。
这是我的数据框:
Name Value
Bob 50
Mary 55
John 51
Todd 50
Linda 56
Tom 55
所以我已经对它进行了排序,但是我需要添加一个排名列,所以它看起来像这样:
Name Value Rank
Bob 50 1
Todd 50 1
John 51 2
Mary 55 3
Tom 55 3
Linda 56 4
所以我发现的是:
resultset$Rank <- ave(resultset$Name, resultset$Value, FUN = rank)
但这给了我:
Name Value Rank
Bob 50 1
Todd 50 2
John 51 1
Mary 55 1
Tom 55 2
Linda 56 1
这么近但又那么远...
无需排序...您可以使用 dense_rank
from "dplyr":
> library(dplyr)
> mydf %>% mutate(rank = dense_rank(Value))
Name Value rank
1 Bob 50 1
2 Mary 55 3
3 John 51 2
4 Todd 50 1
5 Linda 56 4
6 Tom 55 3
我猜你的排名变量可以通过1:length(unique(df$value))
获得。下面是我的试用。
df <- data.frame(name = c("Bob", "Mary", "John", "Todd", "Linda", "Tom"),
value = c(50, 55, 51, 50, 56, 55))
# rank by lengths of unique values
rank <- data.frame(rank = 1:length(unique(df$value)), value = sort(unique(df$value)))
merge(df, rank, by="value")
value name rank
1 50 Bob 1
2 50 Todd 1
3 51 John 2
4 55 Mary 3
5 55 Tom 3
6 56 Linda 4
这是一个 base-R 解决方案:
uv <- unique(df$Value)
merge(df,data.frame(uv,r=rank(uv)),by.x="Value",by.y="uv")
这给出了
Value Name r
1 50 Bob 1
2 50 Todd 1
3 51 John 2
4 55 Mary 3
5 55 Tom 3
6 56 Linda 4
这是内存效率低下的做法,并且会产生重新使用数据的副作用。您也可以这样做:
require(data.table)
DT <- data.table(df)
DT[order(Value),r:=.GRP,by=Value]
这给出了
Name Value r
1: Bob 50 1
2: Mary 55 3
3: John 51 2
4: Todd 50 1
5: Linda 56 4
6: Tom 55 3