与 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
这是 dplyr
和 stringr
的解决方案
## 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
我获得了一个数据集,需要 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
这是 dplyr
和 stringr
的解决方案
## 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