2016-03-19 4 views
1

Ich habe einen Datensatz in R ähnlich einen Dummy, wie gezeigt:Ich brauche eine Ähnlichkeitsbewertung zu den Elementen in meinem Datensatz geben

Apple-3 
Apple-California-4 
Apple-China-3 
Samsung-2 
Samsung-India-2 
Sony-AG-1 
Sony-4 
Sony-USA-4 

ich sie auf einem Ähnlichkeitspunkt kombinieren muß als

Apple-10 
Samsung-4 
Sony-9 

zB Apple, Apple-China, Apple-California kombiniert werden in Apple und ihre Werte werden summiert.

Gibt es eine Möglichkeit, das zu tun?

+0

Wissen Sie, wie ein gemeinsamen Unterschlüssel in den Saiten zu identifizieren (wie in Ihrem Beispiel Apple, Samsung einfach die ersten Zeichen des Strings sind) oder Sie brauchen etwas, das automatisch diese Unterschlüssel oder sogar eine Art von Clustering von ihnen identifiziert? – digEmAll

Antwort

0

Sie sollten den Charakter etwas aus der Partitur trennen zuerst:

# 2 rows one with ID and one with score 
company <- as.matrix(c("Apple", "Apple-California", "Apple-China", "Samsung")) 
score <- as.matrix(c(3, 4,3, 2)) 

# bind columns create a frame 
data <- cbind(company, score) 

# this will return which rows contain the word "Apple" 

n <- grep("Apple", data[,1]) 

auch nützlich zu wissen, wie ein Zeichenvektor um Teilmenge der zusätzlichen Bits bei strsplit(),paste()

Blick loszuwerden und paste0() Funktionen.

Die erste wird Ihnen helfen, den Text in einzelne Zeichen zu zerlegen. Die später werden Ihnen helfen, die Dinge wieder zusammen fügen:

eine andere leicht zu verwenden ist substr("HEllo", 1,4) die Ausgabezeichen 1 bis 4 ->"Hell"

1

Das ist wirklich eine String-Manipulation Übung sein soll, aber ich dachte, das eines sein könnte FUN-Challenge ohne Verwendung von String-Funktionen.

So habe ich Ihre Probe als CSV-Datei gespeichert. Verwenden Sie dann die Bindestriche (-) als Trennzeichen für einen Datenrahmen.

df <- read.csv('Manufacturers.csv', header = F, sep = '-') 

Dies erzeugt einen Datenrahmen mit 3 Spalten

 V1   V2 V3 
1 Apple   3 NA 
2 Apple California 4 
3 Apple  China 3 
4 Samsung   2 NA 
5 Samsung  India 2 
6 Sony   AG 1 
7 Sony   4 NA 
8 Sony  USA 4 

Da V2 ein Faktor, wandelt es in Zahlen.

df$V2 <- as.numeric(as.character(df$V2)) 

An dieser Stelle sind V2 und V3 eine Reihe von Zahlen mit NAs. Lassen Sie uns diese NAs in Nullen umwandeln.

df$V2[is.na(df$V2)] <- 0 
df$V3[is.na(df$V3)] <- 0 

Fügen Sie V2 und V3 zu einer neuen Spalte hinzu. Ich habe meine Menge angerufen.

df$Quantity <-df$V2 + df$V3 

Dann summieren Sie die Spalte Menge.

aggregate(df$Quantity, by=list(Category=df$V1), FUN=sum) 

Und das ist, was ich habe:

Category x 
1 Apple 10 
2 Samsung 4 
3  Sony 9 

Glücklich Codierung!

-bg

1

Hier ist eine andere Art und Weise tun, indem gsub und aggregate. Beachten Sie, dass ich zuvor von factor zu character konvertiert habe.

d$names <- gsub("-.*", "", d$V1) 
d$values <- as.numeric(gsub("[^\\d]", "", d$V1, perl = TRUE)) 
aggregate(values ~ names, d, sum) 
# names values 
#1 Apple  10 
#2 Samsung  4 
#3 Sony  9 

DATA

dput(d) 
structure(list(V1 = c("Apple-3", "Apple-California-4", "Apple-China-3", 
"Samsung-2", "Samsung-India-2", "Sony-AG-1", "Sony-4", "Sony-USA-4" 
), names = c("Apple", "Apple", "Apple", "Samsung", "Samsung", 
"Sony", "Sony", "Sony"), values = c(3, 4, 3, 2, 2, 1, 4, 4)), .Names = c("V1", 
"names", "values"), row.names = c(NA, -8L), class = "data.frame")