如何根据 R 中的用户定义层次结构找到向量的最大字符?
Posted
技术标签:
【中文标题】如何根据 R 中的用户定义层次结构找到向量的最大字符?【英文标题】:How do you find a maximum character of a vector based on user-defined hierarchy in R? 【发布时间】:2016-09-09 03:19:32 【问题描述】:如何根据R中用户定义的层次结构找到向量的最大字符?
我有一个变量,比如Code
,我想对其施加层次结构,以便 MSP
换句话说,R 会这样排列它 1A<...msp r double character>
数据框:
No<-rep(c(1,2,3),c(4,4,3))
Date<-rep(c("05/09/2013","20/05/2013","23/05/2013","28/05/2013","03/06/2013"),c(2,2,2,2,3))
Time<-rep(c("14:15:00","09:40:00","14:30:00","13:10:00","08:45:00"),c(2,1,3,2,3))
Code<-c("MSP","3A","5B",NA,NA,NA,"7C","3B","MSP","MSP",NA)
df<-data.frame(No,Date,Time,Code,stringsAsFactors=FALSE)
df$Date<-dmy(df$Date)
df$Time<-hms(df$Time)
df
# No Date Time Code
# 1 1 2013-09-05 14H 15M 0S MSP
# 2 1 2013-09-05 14H 15M 0S 3A
# 3 1 2013-05-20 9H 40M 0S 5B
# 4 1 2013-05-20 14H 30M 0S <NA>
# 5 2 2013-05-23 14H 30M 0S <NA>
# 6 2 2013-05-23 14H 30M 0S <NA>
# 7 2 2013-05-28 13H 10M 0S 7C
# 8 2 2013-05-28 13H 10M 0S 3B
# 9 3 2013-06-03 8H 45M 0S MSP
# 10 3 2013-06-03 8H 45M 0S MSP
# 11 3 2013-06-03 8H 45M 0S <NA>
我的代码:
我想在每个 No 和 Date 中取 Code
的最大值(基于用户定义的排名)。因此,共享相同 No 和相同 Date 的行将具有相同的 Code。因此,我先将其分组。
我使用ifelse
函数创建了一个名为CodeAnother
的新变量。
-
条件是,如果至少有一个“MSP”并且并非所有元素都是“MSP”
是:通过排除“MSP”来获取最大功能
否:以通常的方式获取 max 函数
library(dplyr)
dfnew<-df %>%
group_by(No,Date) %>%
mutate(IndicatorMSP=(Code=="MSP" & !is.na(Code))) %>%
mutate(CodeNo=sum(!is.na(Code))) %>%
mutate(CodeAnother=ifelse(sum(IndicatorMSP)>=1 & sum(IndicatorMSP)<CodeNo,
max(Code[!(Code=="MSP") & !is.na(Code)]),
max(Code[!is.na(Code)])))
我想知道是否有更好的方法来使用更好的代码来实现这一点。
【问题讨论】:
【参考方案1】:因素是你的朋友:
我重新排序字母的示例:
factoringVariable <- sample(letters)
> factoringVariable
[1] "z" "k" "p" "s" "f" "v" "j" "b" "o" "l" "u" "m" "w" "c" "n" "t" "r" "x" "a" "i" "y" "q" "h" "d" "e" "g"
> sort(factor(letters,levels = factoringVariable))
[1] z k p s f v j b o l u m w c n t r x a i y q h d e g
所以在你的情况下:
factoringVariable <- c('MSP', sort(unlist(outer(1:7,LETTERS[1:3],paste0))))
> factoringVariable
[1] "MSP" "1A" "1B" "1C" "2A" "2B" "2C" "3A" "3B" "3C" "4A" "4B" "4C" "5A" "5B" "5C" "6A" "6B" "6C" "7A"
[21] "7B" "7C"
现在我已经确定了订单:
df$Code <- factor(df$Code, levels = factoringVariable)
然后你可以在 dplyr 中使用 top_n
函数(使用 -1 获得底部 1)
library(dplyr)
dfnew<-df %>%
group_by(No,Date) %>%
top_n(-1,Code)
输出:
> dfnew
Source: local data frame [5 x 4]
Groups: No, Date [4]
No Date Time Code
<dbl> <chr> <chr> <fctr>
1 1 05/09/2013 14:15:00 MSP
2 1 20/05/2013 09:40:00 5B
3 2 28/05/2013 13:10:00 3B
4 3 03/06/2013 08:45:00 MSP
5 3 03/06/2013 08:45:00 MSP
编辑:我现在意识到你想分配所有最大值,在这种情况下,我们不能使用 top_n
改为:
library(dplyr)
dfnew<-df %>%
group_by(No,Date) %>%
mutate(CodeAll = sort(Code, partial = 1)[1])
编辑 2:您实际上可以通过使用部分排序来加快速度(如果您需要速度),因为无论如何您只会选择第一个
【讨论】:
哇这太棒了!我从没想过使用因子。实际上,我想获得“最大值”,所以我将在里面添加 reduction=TRUE。无论如何,我可以确切地知道“部分”在这里做什么吗? 当然,如果您只需要正确位置的某些值,您实际上可以更快地对向量进行排序。 (例如,尝试sort(sample(100), partial = 1:3)
。前 3 个数字将处于正确位置,而其他数字可能正确也可能不正确。但在这种情况下,您知道您只从每个组中取一个值,所以部分可以防止您进行不必要的排序。以上是关于如何根据 R 中的用户定义层次结构找到向量的最大字符?的主要内容,如果未能解决你的问题,请参考以下文章