/ / Réduire les colonnes en regroupant les variables (dans la base) - r

Réduire les colonnes en regroupant les variables (en base) - r

J'ai une variable de texte et une variable de regroupement. Je souhaite réduire la variable de texte en une chaîne par ligne (combiner) par facteur. Donc, tant que la colonne du groupe indique m Je veux regrouper le texte et ainsi de suite. J'ai fourni un échantillon de données avant et après. J'écris ceci pour un paquet et j'ai jusqu'ici évité de nous fier à d'autres paquets sauf pour wordcloudet voudrait le garder de cette façon.

Je soupçonne rle peut être utile avec cumsum mais je n'ai pas été capable de comprendre celui-ci.

Merci d'avance.

À quoi ressemblent les données

                                 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

Ce que je voudrais que les données ressemblent

                                                       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

Les données

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")

MODIFIER: J'ai trouvé que je peux ajouter une colonne unique pour chaque exécution de la variable de groupe avec:

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

Rendement:

                                 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

Réponses:

5 pour la réponse № 1

Cela utilise rle pour créer un identifiant sur lequel grouper les phrases. Il utilise tapply avec paste pour rassembler la sortie

## 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 pour la réponse № 2

J'ai eu la réponse et je suis revenu au poste, mais Dason m'a battu de façon plus compréhensible que la mienne.

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)

MODIFIER Comment je le ferais avec des agrégats et ce que j’ai appris de votre réponse (bien que tapply soit une meilleure solution):

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]])