我有一个基于单列的数据框对象,其中包含带字母和数字字符的字符串 我想基于数字字符与grepl函数的匹配来计算行数。
在我的虚拟数据集中,我有6行包含3个不同数字字符序列的字符串:1911,1896和1906。 在我的真实数据集中,我有30个不同的数字字符序列和30 000行。
dataset <- c("Lorem ipsum dolor sit amet 1911", "consectetur adipiscing elit 1911", "Pellentesque at pellentesque nulla 1906", "Aenean eget feugiat ligula 1906", "Aenean eget feugiat ligula. Fusce vulputate 1911", "dui eget fermentum tristique 1896")
dataset <- as.data.frame(dataset)
使用dplyr计算“1911”的n行
library(dplyr)
dataset2 <- dataset %>%
filter(grepl("1911", dataset)) %>% # filtering with grepl
summarise (total_1911= length(dataset)) # summarise n rows
所以我可以进行迭代以避免为每个数字字符创建此命令? (在基础R或dplyr中)
我的预期输出:
date n
1911 3
1906 2
1896 1
答案 0 :(得分:2)
另一种选择:
count(dataset, date = paste0("total_", gsub("\\D+", "", dataset)))
## A tibble: 3 x 2
# date n
# <chr> <int>
#1 total_1896 1
#2 total_1906 2
#3 total_1911 3
使用gsub
我们删除所有非数字字符并将其与total_
粘贴在一起。我们使用count
来获取每个唯一日期的行数。
答案 1 :(得分:2)
在基数R中,我们可以通过从列中提取所有unique
数字,然后使用grepl
在列中查找每个数字的出现来实现此目的。
nums <- unique(gsub("[^0-9]", "", dataset$dataset))
sapply(nums, function(x) sum(grepl(x, dataset$dataset)))
# 1911 1906 1896
# 3 2 1
答案 2 :(得分:1)
我们提取数字部分,将其用作分组变量和summarise
以获取元素的频率(n()
)
library(tidyverse)
dataset %>%
group_by(date = str_extract(dataset, "\\d+")) %>%
summarise(n = n())
答案 3 :(得分:1)
In base R, we could feed the output of gsub
to table
:
table(gsub("[^0-9]+", "", dataset$dataset))
1896 1906 1911
1 2 3
or as a data.frame with variable names added using setNames
.
setNames(data.frame(table(gsub("[^0-9]+", "", dataset$dataset))), c("date", "n"))
date n
1 1896 1
2 1906 2
3 1911 3