1
votes

Combiner des lignes si le texte est le même avant un certain caractère

J'ai un bloc de données similaire à celui-ci. Je souhaite additionner les valeurs des lignes si le texte de la colonne "Nom" est le même avant le signe - .

 entrez la description de l'image ici


1 commentaires

Bienvenue dans StackOverflow! Veuillez lire les informations sur comment poser une bonne question et comment donner un exemple reproductible . Cela permettra aux autres de vous aider beaucoup plus facilement.


3 Réponses :


0
votes

Vous pouvez relier vos 2 tableaux (haut et bas) dans un bloc de données, puis utiliser dplyr ou data.table . Le data.table serait beaucoup plus rapide pour les grandes tables.

data_framme$Name <- sub("-.*", "", data_frame$Name)

library(dplyr)
data_frame %>%
  group_by(Name) %>%
  summarise_all(sum)


library(data.table)
data.frame <- data.table(data.frame)
data.frame[, lapply(.SD, sum, na.rm=TRUE), by=Name ]


2 commentaires

Cette solution séparerait IRON MAIDEN - A et IRON MAIDEN - B. OP veut identifier les groupes de noms avec le même nom avant le signe «-».


Merci @ J.G. pour avoir signalé cela, j'ai modifié ma réponse.



1
votes

Supprimez tout après "-" en utilisant sub , puis utilisez Comment additionner une variable par groupe

df$Name <- sub("-.*", "",df$Name)
aggregate(cbind(val1, val2)~Name, df, sum)


2 commentaires

Merci, cela fera l'affaire. Mais pouvez-vous m'aider si le bloc de données a les mêmes caractères dans d'autres colonnes, comment puis-je utiliser uniquement des données uniques?


@ GoranKošutić Vous devriez peut-être poster une nouvelle question avec ces détails.



1
votes

Voici une solution data.table.

Données:

df[, Name := sub("-.*", "", Name)]

mat = df[, .(sum(val1), sum(val2)), by = Name]

> mat
       Name V1 V2
1:    IRON   3 11
2: SABBATH   7 15

Code:

df = data.table(
  Name = c('IRON - A', 'IRON - B', 'SABBATH - A', 'SABBATH - B'),
  val1 = c(1,2,3,4),
  val2 = c(5,6,7,8)
)


0 commentaires