Включение функции map () для табулирования каждого элемента в символьном векторе возвращает ошибку - PullRequest
1 голос
/ 14 марта 2020

Я бы хотел составить таблицу частот каждого унитарного элемента в символьном векторе. Это вектор содержит ответы на набор элементов в опросе, с такой структурой «ADCDAB ...», где «A» - ответ на первый элемент, «D» - на второй, et c. Я хотел бы обработать данные с purrr::map в сочетании с функциями базовой строки.

p1 <- strsplit(substr(test$answer),"")
map(p1,table)

Однако, если я включу код с dplyr, система выдаст сообщение об ошибке:

 test %>% 
 mutate(p1=strsplit(answer,"")) %>% 
 map(p1,table) 

система вернет следующее сообщение об ошибке:

Error: Index 1 must have length 1, not 10

Что не так со вторым синтаксисом?

Пустой набор данных

structure(list(answer = c(".BBCBD.A.D", "...DB..AA.", "B......AB.", 
"BDDDBACADD", "BB.ABC.AAD"), d.n.i = c(1, 2, 3, 4, 5)), row.names = c(NA, 
5L), class = "data.frame")

Ответы [ 2 ]

4 голосов
/ 14 марта 2020

Вот вариант base R

x <- "ADCDAB"

out <- table(utf8ToInt(x))
names(out) <- intToUtf8(names(out), multiple = TRUE)
out
#A B C D 
#2 1 1 2

С несколькими элементами использования lapply

x <- c("ADCDAB", "EFG")

f <- function(i) {
      out <- table(utf8ToInt(i))
      names(out) <- intToUtf8(names(out), multiple = TRUE)
      out
  }

lapply(x, f)

Возвращает

#[[1]]
#A B C D 
#2 1 1 2 

#[[2]]
#E F G 
#1 1 1 

Если вам нужен вывод в виде одной таблицы, попробуйте

x <- c("ADCDAB", "EFGAA")
f(paste(x, collapse = ""))
#A B C D E F G 
#4 1 1 2 1 1 1

.. или как фрейм данных

as.data.frame(f(paste(x, collapse = "")))
#  Var1 Freq
#1    A    4
#2    B    1
#3    C    1
#4    D    2
#5    E    1
#6    F    1
#7    G    1
1 голос
/ 14 марта 2020

Вы можете сделать:

library(tidyverse)
test %>% mutate(p1 = strsplit(answer,""), p2 = map(p1, table))

Однако я бы предложил что-то вроде ниже:

test %>% 
   mutate(p1 = strsplit(answer,"")) %>%
   unnest(p1) %>%
   count(answer, p1)

#  answer p1        n
#  <chr>  <chr> <int>
#1 ABCD   A         1
#2 ABCD   B         1
#3 ABCD   C         1
#4 ABCD   D         1
#5 ADCDAB A         2
#6 ADCDAB B         1
#7 ADCDAB C         1
#8 ADCDAB D         2

data

test <- data.frame(answer = c("ADCDAB", "ABCD"), stringsAsFactors = FALSE)
...