Свернуть столбцы путем группировки переменных (в базе) - PullRequest
3 голосов
/ 25 марта 2012

У меня есть текстовая переменная и переменная группировки. Я хотел бы свернуть текстовую переменную в одну строку на строку (объединить) по фактору. Так что, пока столбец группы говорит m, я хочу сгруппировать текст вместе и так далее. Я предоставил примерный набор данных до и после. Я пишу это для пакета и до сих пор избегал всякой зависимости от других пакетов, кроме wordcloud, и хотел бы сохранить его таким образом.

Я подозреваю, что rle может быть полезным с cumsum, но не смог понять это.

Заранее спасибо.

Как выглядят данные

                                 text group
1       Computer is fun. Not too fun.     m
2               No its not, its dumb.     m
3              How can we be certain?     f
4                    There is no way.     m
5                     I distrust you.     m
6         What are you talking about?     f
7       Shall we move on?  Good then.     f
8 Im hungry.  Lets eat.  You already?     m

Как бы я хотел, чтобы данные выглядели как

                                                       text group
1       Computer is fun. Not too fun. No its not, its dumb.     m
2                                    How can we be certain?     f
3                          There is no way. I distrust you.     m
4 What are you talking about? Shall we move on?  Good then.     f
5                       Im hungry.  Lets eat.  You already?     m

Данные

dat <- structure(list(text = c("Computer is fun. Not too fun.", "No its not, its dumb.", 
"How can we be certain?", "There is no way.", "I distrust you.", 
"What are you talking about?", "Shall we move on?  Good then.", 
"Im hungry.  Lets eat.  You already?"), group = structure(c(2L, 
2L, 1L, 2L, 2L, 1L, 1L, 2L), .Label = c("f", "m"), class = "factor")), .Names = c("text", 
"group"), row.names = c(NA, 8L), class = "data.frame")

РЕДАКТИРОВАТЬ: Я обнаружил, что могу добавить уникальный столбец для каждого запуска переменной группы с помощью:

x <- rle(as.character(dat$group))[[1]]
dat$new <- as.factor(rep(1:length(x), x))

Уступая:

                                 text group new
1       Computer is fun. Not too fun.     m   1
2               No its not, its dumb.     m   1
3              How can we be certain?     f   2
4                    There is no way.     m   3
5                     I distrust you.     m   3
6         What are you talking about?     f   4
7       Shall we move on?  Good then.     f   4
8 Im hungry.  Lets eat.  You already?     m   5

Ответы [ 2 ]

5 голосов
/ 25 марта 2012

Это использует rle для создания идентификатора для группировки предложений.Он использует tapply вместе с пастой, чтобы объединить вывод

## Your example data
dat <- structure(list(text = c("Computer is fun. Not too fun.", "No its not, its dumb.", 
"How can we be certain?", "There is no way.", "I distrust you.", 
"What are you talking about?", "Shall we move on?  Good then.", 
"Im hungry.  Lets eat.  You already?"), group = structure(c(2L, 
2L, 1L, 2L, 2L, 1L, 1L, 2L), .Label = c("f", "m"), class = "factor")), .Names = c("text", 
"group"), row.names = c(NA, 8L), class = "data.frame")


# Needed for later
k <- rle(as.numeric(dat$group))
# Create a grouping vector
id <- rep(seq_along(k$len), k$len)
# Combine the text in the desired manner
out <- tapply(dat$text, id, paste, collapse = " ")
# Bring it together into a data frame
answer <- data.frame(text = out, group = levels(dat$group)[k$val])
1 голос
/ 25 марта 2012

Я получил ответ и вернулся к посту, но Дейсон опередил меня, и это стало более понятным, чем мое.что я узнал из вашего ответа (хотя tapply - лучшее решение):

y <- rle(as.character(dat$group))
x <- y[[1]]
dat$new <- as.factor(rep(1:length(x), x))

text <- aggregate(text~new, dat, paste, collapse = " ")[, 2]
data.frame(text, group = y[[2]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...