R语言 计算整个数据框架中文本字符串的示例数

c9x0cxw0  于 2023-07-31  发布在  其他
关注(0)|答案(5)|浏览(82)

我有一个dataframe,我想计算特定文本字符串的示例数。
例如,在下面的数据框架中:

library(dplyr)

df <- iris %>%
  distinct(Species) %>%
  mutate(Species2 = Species,
         Species3 = Species)
df
#      Species   Species2   Species3
# 1     setosa     setosa     setosa
# 2 versicolor versicolor versicolor
# 3  virginica  virginica  virginica

字符串
我想数一下“setosa”出现的次数
使用length(grep("setosa", df$Species)),我可以获得特定列中setosa的计数,但我如何才能对整个数据框架执行此操作?
我试过length(grep("setosa", df)),结果是零。
有什么建议吗

tsm1rwdh

tsm1rwdh1#

如果您只是想要精确匹配的计数,那么您所需要的只是

sum(df == "setosa")

字符串
在更一般的情况下,grep()stringr::str_count()是必要的,例如如果有可能包含目标字符串的句子,你可以使用Reduce()迭代地对每一列的计数求和。

Reduce(\(x, y) x + sum(grepl("setosa", y)), df, init = 0)

在更大的数据集上进行基准测试

它表明最简单的方法表现最好。在一般情况下,我的方法所花费的时间几乎与其他方法相同,但所分配的内存要少得多。

# Dimension: 10000 x 100
df <- as.data.frame(matrix(sample(c("setosa", "virginica", "versicolor"), 1e6, replace = TRUE), 1e4, 1e2))

bench::mark(
  exact_match = sum(df == "setosa"),
  Darren = Reduce(\(x, y) x + sum(grepl("setosa", y)), df, init = 0),
  nrennie = length(grep("setosa", as.matrix(df))),
  jkatam = sum(sapply(df, \(x) grepl('setosa', x))),
  iterations = 100
)

# # A tibble: 4 × 13
#   expression       min  median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time result
#   <bch:expr>  <bch:tm> <bch:t>     <dbl> <bch:byt>    <dbl> <int> <dbl>   <bch:tm> <list>
# 1 exact_match     17ms  17.8ms     55.4    11.53MB   35.4      61    39       1.1s <int> 
# 2 Darren         232ms 247.1ms      4.01    3.86MB    0.446    90    10      22.4s <dbl> 
# 3 nrennie        240ms 255.7ms      3.91   12.79MB    1.30     75    25      19.2s <int> 
# 4 jkatam         239ms 253.2ms      3.94   11.46MB    2.32     63    37        16s <int>

5fjcxozz

5fjcxozz2#

假设你只想要总计数,而不是按列计数,那么如果你先将dataframe转换为矩阵,你的代码就可以工作了:

length(grep("setosa", as.matrix(df)))

字符串
返回3。
注意:与unlist()不同,当列具有不同类时,这也适用:

length(grep("OJ", as.matrix(ToothGrowth)))

bejyjqdl

bejyjqdl3#

library(tidyverse)

df <- data.frame(
  var1 = sample(c("setosa", "virginica", "versicolor"), 100, replace = TRUE),
  var2 = sample(c("setosa", "virginica", "versicolor"), 100, replace = TRUE),
  var3 = sample(c("setosa", "virginica", "versicolor"), 100, replace = TRUE)
)

字符串
您可以使用table()来获取数据集中每个单词的计数。

unlist(df) |> 
  table()
#> 
#>     setosa versicolor  virginica 
#>        108        104         88


或者向下过滤(purrr::keep())以仅包括“setosa”的出现,然后使用length()获得计数。

df |> 
  unlist() |> 
  keep(\(x) x == "setosa") |> 
  length()
#> [1] 108

wbgh16ku

wbgh16ku4#

可选地,sapply如下所示

df2 <- sum(sapply(df, \(x) grepl('setosa', x)))

字符串

cnwbcb6i

cnwbcb6i5#

例如-要计算B:M的示例,可以使用stringr库中的str_count和sum():

sum(stringr::str_count(df$overlaps, "B:M"))

字符串

相关问题