2016-05-11 12 views
-3

Ich bin ein R Newbie. Entschuldige, dass ich eine grundlegende Frage gestellt habe. Ich habe "Daten", die aus drei Spalten besteht (als Beispiel) namens Data Engine, Daten $ Einheit und Daten $ AvailableLeft. data $ AvailableLeft ist ein Dummy (0 oder 1). Und für jeden eindeutigen Wert der Daten $ engine kann es mehrere Werte der Daten $ unit geben. Ich würde gerne Prozent von "1s" in den Daten $ AvailableLeft für jeden Wert der Daten $ engine bzw. data $ unit berechnen. Ich habe hunderttausende von Zeilen, aber nur die ersten 13 Zeilen eingefügt.Berechne Prozentsätze von "1s" in einer Spalte basierend auf zwei anderen Spalten in R

data$engine data$unit  data$AvailableLeft 
    10158  207    1 
    10158  207    0 
    10158  207    1 
    10158  207    0 
    10147  142    1 
    10147  142    1 
    10147  142    1 
    10147  142    0 
    10147  142    1 
    10147  142    0 
    10147  142    1 
    10161  244    0 
    10161  244    0 

Ich möchte meine Ausgabe in diesem Format haben:

data$engine data$unit   Percentage 
    10158   207     20% 
    10147   142     10% 
    10161   244     3% 
     .    .     . 
     .    .     . 
     .    .     . 

ich diese Codes versucht, aber war nicht erfolgreich:

##calculate the percentage of "1s" for whole data and not for each data$engine and data$unit 
sum(data$AvailableLeft==1)/length(data$AvailableLeft) 

# tried to do it in parts but was not able to divide the two columns at last... 
df11 <- data.frame(data$engine, data$unit, data$AvailbleLeft) 
leftwarn1=aggregate(data$AvailableLeft ~ data$engine + data$unit, data = df11, sum) #Counting number of "1s" per unit per engine 
leftwarn10 = count(data$AvailableLeft == 0, c("data$engine","data$unit")) #counting number of "1 and 0" per unit per engine 

Antwort

-1

Versuchen

subset(as.data.frame(with(df, prop.table(table(engine, unit, AvailableLeft))*100)), AvailableLeft==1, select=-AvailableLeft) 

In Bezug auf Ihren Kommentar: obwohl

df <- read.table(col.names=c("engine", "unit", "left"), text=" 
    10158  207    1 
    10158  207    0 
    10158  207    1 
    10158  207    0 
    10147  142    1 
    10147  142    1 
    10147  142    1 
    10147  142    0 
    10147  142    1 
    10147  142    0 
    10147  142    1 
    10161  244    0 
    10161  244    0") 
subset(as.data.frame(with(df, prop.table(table(engine, unit, left))*100)), left==1, select=-left) 
# engine unit  Freq 
# 10 10147 142 38.46154 
# 11 10158 142 0.00000 
# 12 10161 142 0.00000 
# 13 10147 207 0.00000 
# 14 10158 207 15.38462 
# 15 10161 207 0.00000 
# 16 10147 244 0.00000 
# 17 10158 244 0.00000 
# 18 10161 244 0.00000 
+0

Dank für die Antwort verlassen. Ich versuchte, R kehrt mit allen Feldern zurück, die mit Werten gefüllt werden, und Aufforderungen [erreichte getOption ('max.print ") - 255502 Reihen weggelassen] –

+0

Bitte überprüfen Sie die Änderung - scheint, mit den Beispieldaten (?) Zu arbeiten weil ich vergessen habe "left" durch "AvailableLeft" zu ersetzen ... – lukeA

+0

Ich bearbeite dein Skript entsprechend, aber immer noch Fehler. Danke für deine Zeit. df11 <- data.frame (DASlane $ Device, DASlane $ Trip, DASlane $ AvailableLeft) Subset (as.data.frame (mit (df11, prop.Tabelle (Tabelle (DASlane $ Device, DASlane $ Trip, DASlane $ AvailableLeft)) * 100)), DASlane $ AvailableLeft == 1, wählen Sie = -DASlane $ AvailableLeft) –

0
dta <- read.table(text = " 
      data$engine data$unit  data$AvailableLeft 
       10158  207    1 
       10158  207    0 
       10158  207    1 
       10158  207    0 
       10147  142    1 
       10147  142    1 
       10147  142    1 
       10147  142    0 
       10147  142    1 
       10147  142    0 
       10147  142    1 
       10161  244    0 
       10161  244    0", 
        header = TRUE) 

# dta[, 3] for example, returns the third column. 
# aggregate as its helpfile (?aggregate) says allows you to compute summary statistics of data subsets 

aggregate(dta[, 3], by = list(dta[, 1], dta[, 2]), mean) 
+0

Danke. Ich erhalte diesen Fehler: Fehler im Aggregat (dta [, DASlane $ AvailableLeft], by = Liste (dta [, DASlane $ Device],: Objekt 'dta' nicht gefunden ... –

+0

Ihr data.frame heißt Daten nicht dta und du bist nicht richtig eingestellt – Raad

+0

Tut mir leid, ich bin ziemlich neu in R. Ich versuchte mit "Daten" anstelle von "dta" ... können Sie mich bitte auf diesem Weg? Vielen Dank –

0

Die Lösung, die ich ist ziemlich lang, aber es funktionierte gut für mich:

data<-read.table(paste0(file.path(Sys.getenv("USERPROFILE"),"Desktop"), 
"/dta.txt"), header = TRUE) # I transcribed your examble above to notepad and 
# saved it as dta.txt, so I could read the table in R 

enginevalues<-unique(data$engine) # Unique values of "engine" column 
unitvalues<-unique(data$unit) # Unique values of "unit" column 
output<-matrix(ncol=3) # Matrix where I stored the outputs 
digitsafterdot<-2 # Number of digits after dot (or comma, whathever) 

# After, I did two for loops: one for "engine" and other for "unit" values 
# You can understand it as a combinatorial analysis 
for(eng in enginevalues){ 
    dteng<-data[data[,"engine"]==eng,] 
    for(un in unitvalues){ 
    dtunit<-dteng[dteng[,"unit"]==un,] 
# Percentage: Number of 1's x 100 divided by the total number of AvailableLeft values 
    percentage<-round(sum(dtunit[,"AvailableLeft"] == 1)*100/nrow(dtunit), 
                digits=digitsafterdot) 
    # Division by zero is not allowed! 
    if(nrow(dtunit) == 0) percentage<-0 
    output<-rbind(output,c(eng,un,percentage)) 

    } 
} 
output<-output[-1,] # Just removing the initial NA values 
colnames(output)<-c("engine","unit","percentage") # Renaming the output 

output 
#  engine unit percentage 
# [1,] 10158 207  50.00 
# [2,] 10158 142  0.00 
# [3,] 10158 244  0.00 
# [4,] 10147 207  0.00 
# [5,] 10147 142  71.43 
# [6,] 10147 244  0.00 
# [7,] 10161 207  0.00 
# [8,] 10161 142  0.00 
# [9,] 10161 244  0.00 

# Output without zero values 
outputnozeros<-output[output[,"percentage"]!=0.00,] 

outputnozeros 
#  engine unit percentage 
# [1,] 10158 207  50.00 
# [2,] 10147 142  71.43 

Die Lösung von @NBATrends auch funktioniert gut und ist kompakt, aber der hier vorgestellte gibt Ihnen einige zusätzliche Kontrolle über die Schleife. Ich nehme an, dass beide Lösungen wie ein Zauber wirken.

0

Verwendung Anregungen von Ihnen allen, scripted ich es auf diese Weise, und es funktioniert scheinbar (nicht sicher):

df11 <- data.frame(data$engine, data$unit, data$AvailableLeft) 
warn = aggregate(data$AvailableLeft ~ data$engine + data$unit, data = df11, mean) 

Alle Kommentare bitte?

0

Wenn Sie eine große Datenrahmen versuchen data.table Bibliothek .used die von NBATrends erstellten Daten

library(data.table) 
dta <- read.table(text = " 
      data$engine data$unit  data$AvailableLeft 
        10158  207    1 
        10158  207    0 
        10158  207    1 
        10158  207    0 
        10147  142    1 
        10147  142    1 
        10147  142    1 
        10147  142    0 
        10147  142    1 
        10147  142    0 
        10147  142    1 
        10161  244    0 
        10161  244    0", 
        header = TRUE) 
dt <- as.data.table(dta) 
dt[,sum(data.AvailableLeft)*100/.N,.(data.engine,data.unit)] 

data.engine data.unit  V1 
1:  10158  207 50.00000 
2:  10147  142 71.42857 
3:  10161  244 0.00000 

Für genau Ihre Anforderung sollte diese

dt[,paste(as.character(round(sum(data.AvailableLeft)*100/.N,2)),"%"),.(data.engine,data.unit)] 

besser geeignet sein, die

gibt
data.engine data.unit  V1 
1:  10158  207  50 % 
2:  10147  142 71.43 % 
3:  10161  244  0 % 

Um herauszufinden, wie Sie den Prozentsatz von 0 erhalten in data$AvailableLeft sollte von hier aus trivial sein und ich würde das für den Benutzer

Verwandte Themen