R 如何根据列对每个项目进行排名?
我想根据以下示例中的列对每个项目进行排名 对于每个项目,所有元素都存在于LC1中,应排在第一位,在LC2中应排在第二位,在LC3中应排在第三位,在LC4中应排在第四位 输入:R 如何根据列对每个项目进行排名?,r,dataframe,dplyr,tidyr,R,Dataframe,Dplyr,Tidyr,我想根据以下示例中的列对每个项目进行排名 对于每个项目,所有元素都存在于LC1中,应排在第一位,在LC2中应排在第二位,在LC3中应排在第三位,在LC4中应排在第四位 输入: Item LC1 LC2 LC3 LC4 1 0A2926 MW92 RM11 RS11 WK14 2 0A2926 MW92 RM11 RS11 WK15 3 0A2926 MW92 SE92 NA NA 4
Item LC1 LC2 LC3 LC4
1 0A2926 MW92 RM11 RS11 WK14
2 0A2926 MW92 RM11 RS11 WK15
3 0A2926 MW92 SE92 NA NA
4 0A3721 RM11 MW92 NA NA
5 0A4664 MW92 RM11 RS11 NA
输出:
Item LC Rank
0A2926 MW92 1
0A2926 RM11 2
0A2926 SE92 2
0A2926 RS11 3
0A2926 WK14 4
0A2926 WK15 4
0A3721 RM11 1
0A3721 MW92 2
0A4664 MW92 1
0A4664 RM11 2
0A4664 RS11 3
有人可以指导我如何在R中继续此操作吗?一种方法可以是
收集数据,以长格式删除NA
值,并获取Rank
删除列中的字符值,以便只保留数字
library(dplyr)
df %>%
tidyr::gather(Rank, value, starts_with("LC"), na.rm = TRUE) %>%
mutate(Rank = as.integer(gsub("[A-Z]", "", Rank)))
# Item Rank value
#1 0A2926 1 MW92
#2 0A2926 1 MW92
#3 0A2926 1 MW92
#4 0A3721 1 RM11
#5 0A4664 1 MW92
#6 0A2926 2 RM11
#7 0A2926 2 RM11
#8 0A2926 2 SE92
#9 0A3721 2 MW92
#10 0A4664 2 RM11
#11 0A2926 3 RS11
#12 0A2926 3 RS11
#13 0A4664 3 RS11
#14 0A2926 4 WK14
#15 0A2926 4 WK15
您可以像这样使用tidyverse
软件包:
library(tidyverse)
df %>% gather(Rank, LC, -Item) %>%
mutate(Rank = as.numeric(grep("[0-9]", Rank, value = T))) %>%
select(Item, LC, Rank)