транспонировать строку в столбец в R с помощью qdap

Я использовал функцию wfm в пакете "qdap" для транспонирования значений текстовой строки в столбцы и столкнулся с проблемой, когда данные содержат числа вместе с текстом. Например, если значение строки равно «abcdef», транспонирование работает нормально, но если значение равно «ab1000», происходит усечение чисел. Может ли кто-нибудь помочь с предложениями о том, как обойти это?

Подход, опробованный до сих пор:

input <- read.table(header=F, text="101 ab0003 
             101 pp6500 
             102 sm2456")
colnames(input) <- c("id","channel")

require(qdap)
library(qdap)
output <- t(with(input, wfm(channel, id)))
output <- as.data.frame(output)

expected_output<- read.table(header=F,text="1 1 0
                          0 0 1")

colnames(expected_output) <- c("ab0003","pp6500", "sm2456")

person Shankar_m    schedule 22.09.2014    source источник


Ответы (1)


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

Вот два подхода. Один использует mtabulate qdapTools, другой table базового R.

library(qdapTools)
mtabulate(with(input, split(channel, id)))

##     ab0003 pp6500 sm2456
## 101      1      1      0
## 102      0      0      1

t(with(input, table(channel, id)))

##      channel
## id    ab0003 pp6500 sm2456
##   101      1      1      0
##   102      0      0      1

Возможно, ваш MWE не отражает сложность данных, в этом случае он возвращает нас к исходной проблеме. wfm использует tmpackage как серверную часть для некоторых манипуляций. Поэтому нам нужно что-то передать ldots (...). Я перечитал документацию, и это немного сбивает с толку (я добавил эту информацию в версию для разработчиков), но мы хотим передать removeNumbers=FALSE в TermDocumentMatrix, как показано здесь:

output <- t(with(input, wfm(channel, id, removeNumbers=FALSE)))
as.data.frame(output)

##     ab0003 pp6500 sm2456
## 101      1      1      0
## 102      0      0      1
person Tyler Rinker    schedule 23.09.2014
comment
Спасибо, Тайлер - это решило проблему. Поскольку я относительно новый пользователь R, это был один из примеров транспонирования значений, который я видел. Мне также удалось решить проблему с помощью функции dcast в пакете reshape2. - person Shankar_m; 23.09.2014