我有一个200行乘6列的数据框.我有兴趣计算Col A中的值小于特定数字的总时间.该号码可以硬编码.我不知道从哪里开始......
小智 8
对于稍微复杂的问题,使用"which"来告诉"sum"在哪里求和:如果DF是数据帧:
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
Run Code Online (Sandbox Code Playgroud)
示例:将Solar.R(第2列)的值相加,其中Column1或Ozone> 30 AND Column 4或Temp> 90
sum(DF[which(DF[,1]>30 & DF[,4]>90),2])
Run Code Online (Sandbox Code Playgroud)
只需在您的条件下使用 sum 即可。逻辑值被转换为 0 表示 FALSE,1 表示 TRUE,所以对逻辑求和告诉你有多少值为 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
Run Code Online (Sandbox Code Playgroud)
虽然答案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)
基本上发生的情况是,您创建了一个列 A 的布尔向量,它根据您的条件具有 TRUE/FALSE 。然后,您将获取原始数据帧的子集,并在本例中使用它来对 A 列求和。
您可以使用以下示例来尝试一下:
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
Run Code Online (Sandbox Code Playgroud)