#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 был не совсем корректным.