2017-07-13 10 views
0

我想知道如何才能執行此公式中R.據計數結束,等於400和下還計數和等於400的R - Excel中COUNTIF上方和下方設置值

的公式爲下面的Excel中:

=SUM(COUNTIFS(B$2:$B$1048576,{"<=-400",">=400"},A$2:$A$1048576,"="&C2)) 

B2柱:數據 A2柱:日期 C2列匹配日期

下面是一個例子日期幀:

A (time series date) B (data) C (Numerical Date) 
20140219    -412   20140219 
20140219    -273.6666667 20140220 
20140219    -228   20140221 
20140219    -151.3333333 20140224 
20140219    -157   20140225 
20140219    -177.3333333 20140226 
20140219    81.66666667  20140227 
20140219    40    20140228 
20140219    93.33333333  20140303 
20140219    201.6666667  20140304 
20140219    203.6666667  20140305 
20140219    69    20140306 
20140219    -22.66666667 20140307 
20140219    49.33333333  20140310 
20140219    40.33333333  20140311 
20140219    194    20140312 
20140219    74    20140313 
20140219    333.3333333  20140314 
20140219    283.6666667  20140317 
20140219    176.6666667  20140318 
20140219    219    20140319 
20140219    276.6666667  20140320 
20140219    107    20140321 
20140219    138.3333333  20140324 

正如你所看到的...我的時間系列日期在A列,並且延續到現在一直到1分鐘。數據在列b中,列C是輔助列,用於幫助提取特定日期的數據,在該列中的匹配日期中...然後它在數據列中搜索400以上和以下的值。

這裏的目標是針對每個特定日期,計算該給定日期的數字< = -400「,」> = 400。在完成一天之後,它會轉到下一個並用結果填充數據框。

示例出放低於:

date Count 400 
20140819 25 
20140820 50 
20140821 46 
20140822 48 
20140825 43 
20140826 17 
20140827 18 
20140828 18 
20140829 44 
20140902 57 

在樣本數據幀,其結果將是總計數24日期20140219.

+0

[如何在R中實現countifs函數(excel)]的可能重複(https://stackoverflow.com/questions/23000661/how-to-realize-countifs-function-excel-in-r) – G106863

+0

爲什麼它對於您的示例數據框等於24?我只能看到一個值<= - 400,無> = 400。 – Scarabee

回答

2

使用dplyr。帶有示例數據開始:

set.seed(1) 
df <- data.frame(Date=c(rep("20170101",5), rep("20170102",5)), 
       Value=((runif(10)*1600)-800), 
       stringsAsFactors=F) 

head(df) 

     Date  Value 
1 20170101 -375.1861 
2 20170101 -204.6018 
3 20170101 116.5654 
4 20170101 653.1325 
5 20170101 -477.3089 

使用abs(Value) >= 400發現是<=-400>=400,然後group_byDate值,並計算n()

library(dplyr) 
df %>% 
    filter(abs(Value) >= 400) %>% 
    group_by(Date) %>% 
    summarise(Count=n()) 

輸出:

 Date Count 
1 20170101  2 
2 20170102  3 
+0

偉大的解決方案,謝謝!如果我想SUM,這可以以同樣的方式工作嗎? –

+1

是的,只需用'sum(Value)'替換'n()'。 – CPak

+0

非常好 - 謝謝 –

0

使用基地RI將做到以下幾點:

志的假數據(做了天堂的工作,謝謝):

df <- data.frame(A = c(rep("20170101", 5), rep("20170102", 5)), 
       B = ((runif(10) * 1600) - 800), stringsAsFactors = F) 

df$D <- ifelse(abs(df$Value) >= 400, T, F) # Boolean column 
sapply(split(df$D, df$Date), sum) # split and sum 
# 20170101 20170102 
#  2  3 

或者只需在您的數據上運行以下功能:

# much larger data (2206800 rows) 
df <- data.frame(Date = as.character(rep(20170101:20170713, each = 60*60)), Value =((runif(2206800)*1600)-800), stringsAsFactors=F) 

sumcountif <- function(value, date, abs.cutoff) { 
    m <- lapply(split(ifelse(abs(value) >= abs.cutoff, T, F), date), sum) 
    d <- cbind.data.frame(date = names(m), unlist(m), stringsAsFactors = F) 
    rownames(d) <- NULL 
    colnames(d)[2] <- paste0("count_",substitute(abs.cutoff)) 
    d 
} 
sumcountif(df$Value, df$Date, 400) # inputs here