web-dev-qa-db-ja.com

Rの条件付き合計

200行6列のデータフレームがあります。列Aの値が特定の数値よりも小さい合計時間を計算することに興味があります。番号はハードコーディングできます。どこから始めたらいいのかわからない...

5
Sarah Spadanuda

もう少し複雑な問題の場合は、「which」を使用して「sum」に合計する場所を指示します。ifDF is the data frame:

      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

例:Solar.R(列2)の値を合計します。ここで、列1またはオゾン> 30および列4または温度> 90

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

ある数値を下回る値の数を数えるには、?sumを使用できます。

sum( df$columnA < NUMBER )
6
sgibb

条件に合計を使用するだけで機能します。論理値はFALSEの場合は0に、TRUEの場合は1に変換されるため、論理値を合計すると、TRUEの値の数がわかります。

 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
3
Dason

答えsum( df$columnA < NUMBER )は正しいですが、少し拡張したほうがよいかもしれません。

カウントする代わりに値を合計したい場合は、次のように言います。

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

または、NA値がある場合は、次を使用します。

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

基本的に、条件に基づいてTRUE/FALSEを持つcolumnAのブールベクトルを作成するとどうなりますか。次に、元のデータフレームのサブセットを取得し、この場合はそれを使用してcolumnAの合計を実行します。

試してみるために使用できる例を次に示します。

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

# Count
sum(df$colA) # NA
sum(df$colA, na.rm=TRUE) # 10 This is actually sum of values since colA wasn't turned into vector of booleans
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

# Sum of values
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') # Boolean vector
sub_df = df[bn_vector,] # Subset of the dataframe. Leaving the second argument in [] empty uses all the columns
sub_df_colA = df[bn_vector, 'colA'] # Content of column 'colA' which is vector of numbers
sum(sub_df$colA) # 4
sum(sub_df_colA) # 4
2
TeemuK