2016-04-06 8 views
2

Ich habe folgenden Datenrahmen, table5, bestehend aus x und ihrer Frequenz, von anderen Daten erzeugte counts Verwendung:R: Erstellen Matrix von Werten von anderer Tabelle

x freq 
1 1 3 
2 3 21 
3 4 21 
4 5 1345 
5 7 1 

den Ich mag würde übertragen - in einer allgemeinen Art und Weise, das heißt für die Verwendung mit anderen Werten in der Originaldatenrahmen - in den folgenden Datenrahmen table5if:

 Frequency 
3    21 
4    21 
5    1345 
other   4 

also dort, wo die Frequenz der Zahlen 3, 4 und 5 direkt übertragen wird, und al l andere Nummern werden in other addiert. Meine jüngste Versuch ist dies:

k <- seq(1, nrow(table5), by=1) 
    ifelse(table5$x[k] == 3, table5if[1] <- table5$freq[k], 
      ifelse(table5$x[k] == 4, table5if[2] <- table5$freq[k], 
       ifelse(table5$x[k] == 5, table5if[3] <- table5$freq[k], table5if[4] <- (table5if[4] + table5$freq[k]) 
       ) 
      ) 
    ) 

Dieser Versuch und andere Versuche mit if(...){...} else {...} etc., alle haben irgendeine Form von Warnungen oder Fehler ergab (zB „Anzahl der Elemente zu ersetzen ...“ und „Anzahl der Dimensionen .. . "und habe keine überzeugenden Ergebnisse erzielt. Ich habe unzählige andere Fragen für beide Fehler/Warnungen durchgesehen und kann nicht ganz das finden, wonach ich suche - es gibt eine Menge über Vektorisierung, aber ich kann meine nicht ganz bekommen warum Kopf herum, dass das Problem wäre. Kann jemand bitte eine geeignete Option für diese kleine Aufgabe vorschlagen?

+0

Warum nicht einfach alle Frequenzen addieren und dann die für die Zahlen 3, 4 und 5 subtrahieren, um die Summe für andere zu berechnen? –

+0

Dies wäre sicherlich die einfachste Option! Ich bin auch ein Fan von vorgefertigten Funktionen zu vermeiden und es auf Mathematik und Logik zu halten. Vielen Dank für deinen Vorschlag, windrunn3r.1990! – Psydes

Antwort

3

ich von factor(x, levels = 3:5) während alle nicht vorhandenen Ebenen NA wird sich aggregieren würden. Sie können die n ändern Sie dies später zu "other", wenn Sie mögen. data.table ist in diesem Fall praktisch, da es die NA s eine separate Gruppe hält, statt sie Weglassen

library(data.table) 
setDT(df)[, .(Frequency = sum(freq)), by = factor(x, levels = 3:5)] 
# factor Frequency 
# 1:  NA   4 
# 2:  3  21 
# 3:  4  21 
# 4:  5  1345 
+0

Das hat auch super funktioniert! Vielen Dank, David Arenburg. – Psydes

0

Eine base R Option einen logischen Index mit %in% auf den Werten von ‚x‘ Spalte basierte erstellen wäre. Wir erhalten die sum von 'freq' basierend auf dem negierten Index von 'i1' und rbind mit den Teilmengenzeilen von 'table5'.

i1 <- table5$x %in% 3:5 
`row.names<-`(rbind(table5[i1,], list(x= "Other", 
      freq=sum(table5[!i1,"freq"]))), NULL) 
#  x freq 
#1  3 21 
#2  4 21 
#3  5 1345 
#4 Other 4 
+0

Das war ein absoluter Genuss! Ich habe es mit manipulierten Werten aus Tabelle 5 getestet und hatte keine Probleme. +10 Straßenkredite für dich, akrun! Vielen Dank. – Psydes

+0

@Psydes Danke für das Feedback. Hast du vergessen zu upvoten? – akrun

Verwandte Themen