Специфичный разделитель может отделять фрейм данных

#r

#r

Вопрос:

Я пытаюсь выполнить эту команду

 df2 <- as.data.frame.matrix(table(stack(setNames(strsplit(df$col1, "---", fixed = TRUE), df$id))[2:1]))
  

Однако я получаю эту ошибку:

 Error in table(stack(setNames(strsplit(df$col1,  : 
  attempt to make a table with >= 2^31 elements
  

Есть идеи, почему произошла эта ошибка? К сожалению, я не могу предоставить воспроизводимый пример с этим кодом, потому что я не могу найти причину этой ошибки.

Что делает эту команду, так это то, что она создает значения 0 и 1, которые разделяются на — .

Пример ввода:

 data.frame(id = c(1,2), col1 = c("text---here","text---there"))
  

ожидаемый результат

 data.frame(id = c(1,2), text = c(1,1), here = c(1,0), there = c(0,1))
  

Ответ №1:

Если рассматриваемая задача сложна, стоит разбить ее на куски. Попробуйте это:

 x = data.frame(id = c(1,2), col1 = c("text---here","text---there")); x$col1 = as.vector(x$col1)
Split = strsplit(as.vector(x$col1), split = "---")
levels = unique(unlist(Split))
x = cbind(x, matrix(ncol = length(levels), nrow = nrow(x)))
for(i in 1:length(levels))
{
  x[,ncol(x)-length(levels) i] <- sapply(Split, function(x) max(x == levels[i]))
}
colnames(x) <- c("id", "col1", levels)
x
# id         col1 text here there
# 1  1  text---here    1    1     0
# 2  2 text---there    1    0     1
  

Комментарии:

1. спасибо, мне нужно иметь в качестве имен столбцов текст, который вставлен в разделение. Пожалуйста, проверьте пример ожидаемого результата, который я предоставил

2. Уважаемый Хелн, я добавил строку для включения имен столбцов. Я также заменил grepl для точного соответствия разделенному вектору: поскольку некоторые уровни содержатся в других (например, «здесь» содержится в «там»), результирующий data.frame был не совсем корректным.