7 Stimmen

Bedingte Summe in R

Ich habe ein Datensatz, der 200 Zeilen und 6 Spalten hat. Mich interessiert, wie oft ein Wert in Spalte A kleiner als eine spezifische Zahl ist. Diese Zahl kann fest codiert sein. Ich weiß nicht, wo ich anfangen soll...

11voto

Theuns Punkte 111

Für ein etwas komplexeres Problem verwenden Sie "which", um dem "sum" zu sagen, wo es addieren soll: wenn DF das Datenrahmen ist:

      Ozone Solar.R  Wind Temp Month Day
 1      41     190  7.4   67     5   1
 2      97     267  6.3   92     7   8   
 3      97     272  5.7   92     7   9

Beispiel: Die Werte von Solar.R (Spalte 2) addieren, bei denen Spalte1 oder Ozone>30 UND Spalte 4 oder Temp>90

sum(DF[which(DF[,1]>30 & DF[,4]>90),2])

6voto

sgibb Punkte 24896

Um zu zählen, wie viele Werte unter einem bestimmten Wert liegen, könnten Sie ?sum verwenden

sum( df$columnA < NUMBER )

6voto

Dason Punkte 58072

Nur die Verwendung von sum auf Ihrer Bedingung wird funktionieren. Logische Werte werden in 0 für FALSCH und 1 für WAHR umgewandelt, sodass die Summation über ein logisches Ihnen sagt, wie viele Werte WAHR sind.

dat <- as.data.frame(matrix(1:36,6,6))
colnames(dat) <- paste0("Col", LETTERS[1:6])
dat$ColA
# [1] 1 2 3 4 5 6
dat$ColA < 3
# [1]  TRUE  TRUE FALSE FALSE FALSE FALSE
sum(dat$ColA < 3)
# [1] 2

4voto

TeemuK Punkte 1795

Während die Antwort sum( df$columnA < NUMBER ) korrekt ist, könnte es besser sein, ein wenig darauf einzugehen.

Sagen wir, wenn Sie die Werte summieren möchten, anstatt sie zu zählen, könnten Sie verwenden:

sum(df[df$columnA < Number,]$columnA)

Oder wenn es NA Werte gibt, verwenden Sie:

sum(df[df$columnA < Number,]$columnA, na.rm=TRUE)
sum(df[(df$columnA < Number)&(!is.na(df$columnA)),]$columnA)

Grundsätzlich erstellen Sie dort einen booleschen Vektor von columnA, der TRUE/FALSE basierend auf Ihrer Bedingung hat. Dann nehmen Sie eine Teilmenge des ursprünglichen Datenrahmens und verwenden diese in diesem Fall zur Summierung von SpalteA.

Hier ist ein Beispiel, das Sie ausprobieren können:

df = data.frame(colA=c(1, 2, 3, 4, NA), colB=c('a', NA, 'c', 'd', 'e'))

# Zählen
sum(df$colA) # NA
sum(df$colA, na.rm=TRUE) # 10 Das ist tatsächlich die Summe der Werte, da colA nicht in einen Vektor von booleschen Werten umgewandelt wurde
sum(df$colA > 0, na.rm=TRUE) # 4
sum(df$colA > 2, na.rm=TRUE) # 2
sum((df$colA > 2) & (df$colB == 'd'), na.rm=TRUE) # 1

# Summe der Werte
sum(df$colA, na.rm=TRUE) # 10
sum(df[df$colA > 0,]$colA, na.rm=TRUE) # 10
sum(df[df$colA > 2,]$colA, na.rm=TRUE) # 7
bn_vector = (df$colA > 2)&(df$colB=='d') # Boolescher Vektor
sub_df = df[bn_vector,] # Teilmenge des Datenrahmens. Wenn Sie das zweite Argument in [] leer lassen, werden alle Spalten verwendet
sub_df_colA = df[bn_vector, 'colA'] # Inhalt der Spalte 'colA', die ein Vektor von Zahlen ist
sum(sub_df$colA) # 4
sum(sub_df_colA) # 4

0voto

anaconda Punkte 45

Ozone<-c(41,97,97)

Solar.R<-c(190,267,272)

Wind<-c(7.4,6.3,5.7)

Temp<-c(67,92,92)

Month<-c(5,7,7)

Day<-c(1,8,9)

tbl<-data.frame(Ozone,Solar, Wind , Temp,Month, Day)

tbl

Ozone | Solar.R | Wind | Temp | Month | Day 1 41 | 190 | 7.4 | 67 | 5 | 1 2 97 | 267 | 6.3 | 92 | 7 | 8 3 97 | 272 | 5.7 | 92 | 7 | 9

sum(tbl$Temp) / sum(!is.na(tbl$Temp))

[1] 84

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X