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

У меня есть текстовая переменная и переменная группировки. Я хотел бы свернуть текстовую переменную в одну строку на строку (объединить) по фактору. Так что пока колонка группы говорит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)

Решение Вопроса

по которому группируются предложения. Он использует 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])
 Bryan Goodrich25 мар. 2012 г., 07:04
Я не верю, что вам нужно "seq (length (k $ len))", поскольку sequence будет "seq_along" вектором длины k $, давая вам эквивалентную последовательность чисел: id <- rep (seq (k $ length), к $ длина)
 Dason25 мар. 2012 г., 07:28
@BryanGoodrich Хороший улов. Первоначально я просто собирался сделать 1: length (k $ len), но в последнее время я больше двигался в направлении использования seq и seq_along, и я думаю, что в итоге я ошибся в двух подходах.
 Bryan Goodrich26 мар. 2012 г., 09:16
Я обычно просто придерживаюсь seq, но для ясности я вижу, как seq_along делает явным то, что вы численно пересекаете вектор значений. Я часто склоняюсь к этому пути ясности, когда сталкиваюсь с избыточностью логических векторов, используя x [который (... некоторая логика здесь ...)]. Это не является необходимым, но оно дает лингвистическую ясность кодированию, которое я предпочитаю.

но Дейсон опередил меня, и это стало более понятным, чем мое.

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

Paste <- function(x) paste(x, collapse=" ")
aggregate(text~new, dat, Paste)

РЕДАКТИРОВАТЬ Как я это сделаю с агрегатом и что я узнал из вашего ответа (хотя 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]])
 Dason25 мар. 2012 г., 06:06
Обратите внимание, что вам не нужно определять «Вставить», так как агрегат позволяет передавать дополнительные параметры применяемой функции. Вы должны быть в состоянии удалить Вставить и использовать это вместоaggregate(text ~ new, dat, paste, collapse = " ")

Ваш ответ на вопрос