R - 获取给定时间段内最常见的字符串值(模式)

时间:2013-06-23 20:45:40

标签: string r plyr mode

我原本希望使用ddply的模式功能按时间段查找某个用户最常用的字符串。

这与this问题和this question显着相关。

使用与此类似的数据集:

Data <- data.frame(
    groupname = as.factor(sample(c("red", "green", "blue"), 100, replace = TRUE)),
    timeblock = sample(1:10, 100, replace = TRUE),
    someuser = sample(c("bob", "sally", "sue"), 100, replace = TRUE))

我试过了:

groupnameagg<- ddply(Data, .(timeblock, groupname, someuser), summarise, groupmode = mode(groupname))

但这并没有达到我的预期。它返回:

> head(groupnameagg$groupname)
[1] "numeric" "numeric" "numeric" "numeric" "numeric" "numeric"
  1. 如何按用户按用户查找最常出现的群组名称? 结果类似于:
  2. 
        timeblock   username  mostcommongroupforuser
            1          bob     red
            1          sally   red
            1          sue     green
            2          bob     green
            2          sally   blue
            2          sue     red
    
    1. 如果groupname按级别组织,我如何获得每个时间块中的最高级别?

2 个答案:

答案 0 :(得分:3)

认为聚合应该可以解决这两个问题

第1部分

aggregate(Data$groupname,by=list(Data$timeblock,Data$someuser),
     function(x) { 
          ux <- unique(x) 
          ux[which.max(tabulate(match(x, ux)))] })

第2部分

aggregate(Data$groupname,by=list(Data$timeblock,Data$someuser),
     function(x) { 
         levels(Data$groupname)[max(as.numeric(x))] })

答案 1 :(得分:0)

使用ddply

中的plyr
ddply(Data, .(timeblock, groupname, someuser),
  function(x){as.character(
                    unique(
                      x$groupname[x$someuser==
                                    names(which.max(table(x$someuser)))
                        ]
                      )
                    )
              }
  )

    timeblock groupname someuser    V1
1          1      blue      bob  blue
2          1      blue    sally  blue
3          1     green      bob green
.........