与 R 中的聚合函数连接

Concatenating with the aggregate function in R

我获得了一个数据集,需要 concatenated/aggregated 符合特定标准。我知道如何为数字变量执行此操作,但是这次,我需要从字符串向量中计算一些东西,例如我有:

V1 V2
1 YYY
1 MMMMMM
1 UUUU
2 YY
2 UUU
.
.
. 

我正在尝试计算特定 V1 上的 MU %,因此我的结果集类似于:

V1 V2
1  75%
2  60%

我一直在摆弄聚合函数,但我无法让它至少粘贴连接来自 V1 的所有数据,所以

aggregate(V1~V2, data=x,FUN=paste(x)) 

显然对我不起作用。

这里有一个直接来自原始数据集的方法:

library(stringi)
stack(
tapply(d$V2, d$V1, 
  function(ii) sum(stri_count_regex(ii, "M|U")) / 
               sum(stri_count_regex(ii, "."))))
#     values ind
#1 0.7692308   1
#2 0.6000000   2

要使用聚合语句,您只需进行一些更改:

d2 <- aggregate(V2 ~ V1, data=d, function(ii) paste0(ii, collapse="")) 

# no packages used in this solution:
d2$V2 <- 
  sapply(
    strsplit(d2$V2, "", perl=TRUE),
    function(ii) sum(grepl("M|U", ii))/length(ii))
#  V1        V2
#1  1 0.7692308
#2  2 0.6000000

或者使用 stringi 包中的 stri_count 函数,有一个更短的选择:

d2 <- aggregate(V2~V1, data=d, function(ii) paste0(ii, collapse="")) 

library(stringi)
d2$V2 <- stri_count_regex(d2$V2, "M|U") / nchar(d2$V2)
#  V1        V2
#1  1 0.7692308
#2  2 0.6000000

这是 dplyrstringr 的解决方案

## Create the sample data
dat <- read.table(text = "V1 V2
1 YYY
1 MMMMMM
1 UUUU
2 YY
2 UUU", header = TRUE, stringsAsFactors = FALSE)

## Load the packages
library("dplyr")
library("stringr")

对于V1中的每一组,计算字符总数中M和U的数量:

dat %>%
  group_by(V1) %>%
  summarize(V2 = sum(str_count(V2, "M|U")) / sum(nchar(V2)))

## Source: local data frame [2 x 2]

##      V1        V2
##   (int)     (dbl)
## 1     1 0.7692308
## 2     2 0.6000000

选项data.table

library(data.table)
setDT(dat)[, list(V2=sum(nchar(V2)-nchar(gsub("M|U", "", 
                         V2)))/sum(nchar(V2))), V1]
#   V1        V2
#1:  1 0.7692308
#2:  2 0.6000000