如何根据 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 中的用户定义层次结构找到向量的最大字符?的主要内容,如果未能解决你的问题,请参考以下文章

获取R向量中的所有最大值索引

文件管理-第一节9:文件系统的层次结构

如何根据在 R 中使用 strsplit 的分隔类型定义 if 语句?

如何在雪花中获取用户角色层次结构?

如何找到向量中的最大元素(C++)?

根据 R 中的条件操作向量