2017-10-08 3 views
-2

J'ai une trame de données comme ci-dessous.Combinaison de cellules ayant des valeurs similaires dans une rangée

New_ment1_1 New_ment1_2  New_ment1_3   New_ment1_4 
1 application  android   ios      NA 
2 donald trump agreement  climate    united states 
3 donald trump agreement  paris    united states 
4 donald trump agreement united states    NA 
5 donald trump  climate  emission    united states 
6 donald trump entertainer  host     president 
7 hen    chicken  mustard     wimp 
8 husband   pamela  private lives    NA 
9 pan    chicken   hen      wimp 
10 sex   associate  pamela     partner 
11 united kingdom chicken   hen      wimp 
12 united states agreement  paris      NA 

Et je veux la résultante en tant que trame de données avec des lignes comme ci-dessous

Par exemple, Row1 devrait être en tant que telle, car il n'a pas de lignes semblables.

si vous voyez lignes 2,3,4,5 et 12. Ils doivent être combinés dans une même rangée comme

united states donald trump paris climate agreement emission 

et les lignes 7,9 et 11 devraient être combinés comme

united kingdom chicken hen wimp mustard 

Il peut être dans n'importe quel ordre.

+0

Vous ne savez pas exactement ce que vous entendez par "similaire". Aussi, qu'avez-vous essayé jusqu'à présent? – useR

+0

similaire à, dans une rangée de 4 mots, si deux mêmes mots sont là dans deux rangées, je veux les combiner. –

Répondre

0

Supposons que la trame de données DF soit représentée de manière reproductible dans la note à la fin.

Convertissez cela en une matrice de caractères m. Disons que deux lignes sont similaires si elles ont plus d'un élément en commun et définissent is_similar pour prendre deux index de ligne et retourner TRUE ou FALSE en conséquence. Appliquez-le ensuite à chaque paire de lignes à l'aide de outer. Interprétez cela comme la matrice d'adjacence d'un graphique et calculez les composants connectés en divisant DF en une liste L dont chacun des éléments est une trame de données des lignes de DF qui constituent ce composant connecté. Enfin, retravailler L dans une matrice de caractères.

library(igraph) 

m <- as.matrix(DF) 
n <- nrow(m) 
is_similar <- function(i, j) length(intersect(na.omit(m[i, ]), na.omit(m[j, ]))) > 1 
smat <- outer(1:n, 1:n, Vectorize(is_similar)) 

adj <- graph.adjacency(smat) 
cl <- components(adj)$membership 

str(split(1:n, cl)) 
## List of 6 
## $ 1: int 1 
## $ 2: int [1:5] 2 3 4 5 12 
## $ 3: int 6 
## $ 4: int [1:3] 7 9 11 
## $ 5: int 8 
## $ 6: int 10 

spl <- split(DF, cl) 
L <- lapply(spl, function(x) na.omit(unique(unlist(x)))) 
t(do.call("cbind", lapply(L, ts))) 

donnant:

[,1]   [,2]   [,3]    [,4]  [,5]  [,6]  
1 "application" "android"  "ios"   NA   NA  NA   
2 "donald_trump" "united_states" "agreement"  "climate" "paris" "emission" 
3 "donald_trump" "entertainer" "host"   "president" NA  NA   
4 "hen"   "pan"   "united_kingdom" "chicken" "mustard" "wimp"  
5 "husband"  "pamela"  "private_lives" NA   NA  NA   
6 "sex"   "associate"  "pamela"   "partner" NA  NA  

Note: L'entrée sous forme reproductible est:

Lines <- " 
New_ment1_1 New_ment1_2  New_ment1_3   New_ment1_4 
1 application  android   ios      NA 
2 donald_trump agreement  climate    united_states 
3 donald_trump agreement  paris    united_states 
4 donald_trump agreement united_states    NA 
5 donald_trump  climate  emission    united_states 
6 donald_trump entertainer  host     president 
7 hen    chicken  mustard     wimp 
8 husband   pamela  private_lives    NA 
9 pan    chicken   hen      wimp 
10 sex   associate  pamela     partner 
11 united_kingdom chicken   hen      wimp 
12 united_states agreement  paris      NA" 

DF <- read.table(text = Lines, header = TRUE, as.is = TRUE) 

Mise à jour: définition de similarité fixe.