суммировать из совпадений строк - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть этот столбец df:

df <- data.frame(Strings = c("ñlas onepojasd", "onenañdsl", "ñelrtwofkld", "asdthreeasp", "asdfetwoasd", "fouroqwke","okasdtwo", "acmofour", "porefour", "okstwo"))
> df
          Strings
1  ñlas onepojasd
2       onenañdsl
3     ñelrtwofkld
4     asdthreeasp
5     asdfetwoasd
6       fouroqwke
7        okasdtwo
8        acmofour
9        porefour
10         okstwo

Я знаю, что каждое значение из df$Strings будет соответствовать словам one, two, three or four.И я также знаю, что это будет соответствовать только ОДНОМУ из этих слов.Таким образом, чтобы соответствовать им:

str_detect(df$Strings,"one")
str_detect(df$Strings,"two")
str_detect(df$Strings,"three")
str_detect(df$Strings,"four")

Однако я застрял здесь, как я пытаюсь сделать эту таблицу:

Homes  Quantity Percent
  One         2     0.3
  Two         4     0.4
Three         1     0.1
 Four         3     0.3
Total        10       1

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

С tidyverse и janitor вы можете сделать:

df %>%
 mutate(Homes = str_extract(Strings, "one|two|three|four"),
        n = n()) %>%
 group_by(Homes) %>%
 summarise(Quantity = length(Homes),
           Percent = first(length(Homes)/n)) %>%
 adorn_totals("row")

 Homes Quantity Percent
  four        3     0.3
   one        2     0.2
 three        1     0.1
   two        4     0.4
 Total       10     1.0

Или просто tidyverse:

 df %>%
 mutate(Homes = str_extract(Strings, "one|two|three|four"),
        n = n()) %>%
 group_by(Homes) %>%
 summarise(Quantity = length(Homes),
           Percent = first(length(Homes)/n)) %>%
 rbind(., data.frame(Homes = "Total", Quantity = sum(.$Quantity), 
                     Percent = sum(.$Percent)))

В обоих случаях код, во-первых, извлекаетсопоставить шаблон и подсчитать количество случаев.Во-вторых, он группируется по подобранным словам.В-третьих, он вычисляет количество падежей на слово и пропорцию данного слова от всех слов.Наконец, он добавляет строку «Всего».

0 голосов
/ 20 февраля 2019
Параметр

A base R будет regmatches/regexpr с table

table(regmatches(df$Strings, regexpr('one|two|three|four', df$Strings)))
#  four   one three   two 
#    3     2     1     4 

, добавив addmargins, чтобы получить sum, а затем разделить на это

out <- addmargins(table(regmatches(df$Strings, 
     regexpr('one|two|three|four', df$Strings))))
out/out[length(out)]

# four   one three   two   Sum 
#  0.3   0.2   0.1   0.4   1.0 
0 голосов
/ 20 февраля 2019

Вы можете использовать str_extract, а затем сделать table и prop.table, то есть

library(stringr)

str_extract(df1$Strings, 'one|two|three|four')
#[1] "one"   "one"   "two"   "three" "two"   "four"  "two"   "four"  "four"  "two"  

table(str_extract(df1$Strings, 'one|two|three|four'))
# four   one three   two 
#    3     2     1     4 

prop.table(table(str_extract(df1$Strings, 'one|two|three|four')))
# four   one three   two 
#  0.3   0.2   0.1   0.4 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...