Создание таблицы, извлекающей первую букву в строке и считающей в R - PullRequest
2 голосов
/ 01 ноября 2019

Я пытаюсь извлечь первую букву строки, разделенную запятыми, затем подсчитываю, сколько раз эта буква появляется. Итак, пример столбца в моем фрейме данных выглядит следующим образом:

test <- data.frame("Code" =  c("EKST, STFO", "EFGG", "SSGG, RRRR, RRFK", 
"RRRF"))

И я бы хотел добавить столбец рядом с ним, который выглядит следующим образом:

test2 <- data.frame("Code" =  c("EKST, STFO", "EFGG", "SSGG, RRRR, RRFK", 
"RRRF"), "Code_Count" = c("E1, S1", "E1", "S1, R2", "R1"))

КодСтолбец count извлекает первую букву строки и подсчитывает, сколько раз эта буква появляется в этой конкретной ячейке.

Я рассмотрел использование strsplit, чтобы получить первую букву в столбце, разделенную запятыми, но я неОбязательно подсчитайте, сколько раз эта буква появляется в ячейке.

1 Ответ

4 голосов
/ 01 ноября 2019

Вот один вариант, использующий основание R. Это разбивает столбец Code на запятую (и хотя бы один пробел), затем подсчитывает количество раз, когда появляется первая буква, а затем вставляет их обратно в желаемый вывод. Он сортирует новый столбец в алфавитном порядке (что не соответствует вашему выводу). Надеюсь, это поможет!

test2$Coode_Count2 <- sapply(strsplit(test2$Code, ",\\s+"), function(x) {
  tab <- table(substr(x, 1, 1)) # Create a table of the first letters
  paste0(names(tab), tab, collapse = ", ") # Paste together the letter w/ the number and collapse them
} )

test2
              Code Code_Count Coode_Count2
1       EKST, STFO     E1, S1       E1, S1
2             EFGG         E1           E1
3 SSGG, RRRR, RRFK     S1, R2       R2, S1
4             RRRF         R1           R1

Вот более точное решение, stringr / purrr, которое захватывает первую букву слова и делает то же самое (вместо разбиения строки)

library(purrr)
library(stringr)

map_chr(str_extract_all(test2$Code, "\\b[A-Z]{1}"), function(x) {
  tab <- table(x)
  paste0(names(tab), tab, collapse = ", ")
  } )

Данные :

test2 <- data.frame("Code" =  c("EKST, STFO", "EFGG", "SSGG, RRRR, RRFK", 
                            "RRRF"), "Code_Count" = c("E1, S1", "E1", "S1, R2", "R1"))
test2[] <- lapply(test2, as.character) # factor to character
...