使用“if”语句按日期求和

问题描述:

我想在数据框中使用“if”语句在两个日期之间求和。使用“if”语句按日期求和

date = seq(as.Date("2000-01-01"), as.Date("2000-01-31"), by="days") 
nums = seq(1, 1, length.out = 31) 
df = data.frame(date, nums) 

if(df$date >= as.Date("2000-01-01") && df$date <= as.Date("2000-01-07")){ 
    sum(df$nums) 
} 

然而,输出为 “31”,而不是 “7” 为我所期望的。有没有更好的方法按日期进行总结?我想使用“if”语句,因为我想将其应用于具有许多不同列且时间长度不同的更大的数据集。

+0

使用单一的'&',这是可以做到这将使相同的答案在这种情况下,因为“NUMS”一栏是所有'1等方式 – akrun

我们可以在逻辑矢量上做sum。请注意,我们仅使用一个&来返回逻辑向量。

sum(df$date >= as.Date("2000-01-01") & df$date <= as.Date("2000-01-07")) 

如果“NUMS”的值不是全1,则子集基于逻辑矢量“NUMS”,并获得sum`

sum(df$nums[df$date >= as.Date("2000-01-01") & df$date <= as.Date("2000-01-07")]) 
+0

',但我认为既不是一般的,也不是实际要求的,因为在这两种情况下,你都没有总结“数量”。 –

+1

我做了,但我没有看够我想。期待在另一个地方找到'nums'。 –

library(dplyr) 

# your data 
date = seq(as.Date("2000-01-01"), as.Date("2000-01-31"), by="days") 
nums = seq(1, 1, length.out = 31) 
df = data.frame(date, nums) 

# answer 
df %>% 
    filter(date >= '2000-01-01' & date <= '2000-01-07') %>% 
    summarize(sum = sum(nums)) 

只需使用此功能:

sum_by_dates <- function(frame, date_column, num_column, date1, date2) { 
    sub_vec <- frame[[date_column]][frame[[date_column]] >= as.Date(date1) & frame[[date_column]] <= as.Date(date2)] 
    df_new <- subset(frame, frame[[date_column]] %in% sub_vec) 
    tot <- sum(df_new[[num_column]]) 
    return(tot) 
} 

用法:

sum_by_dates(df, 'date', 'nums', '2000-01-01', '2000-01-07') 

R中的if功能未矢量化,也不是“& &”操作员。采用合理的子集的常用方法是将量化运算符“&”,并把它的第一个参数“[”:

sum(df[ df$date >= as.Date("2000-01-01") & df$date <= as.Date("2000-01-07"), 
    #That is a logical vector in the row selection position. 
    "nums"]) # The second argument to "[" is/are the column(s) to be selected. 
#[1] 7 

...并说明R的多样性,这是一个使用sqldf的解决方案。

date = seq(as.Date("2000-01-01"), as.Date("2000-01-31"), by="days") 
nums = seq(1, 1, length.out = 31) 
df = data.frame(date, nums) 

startDate <- as.Date("2000-01-01") 
endDate <- as.Date("2000-01-07") 
library(sqldf) 
fn$sqldf("select sum(nums) from df where date between $startDate and $endDate") 

和输出:

> fn$sqldf("select sum(nums) from df where date between $startDate and $endDate") 
    sum(nums) 
1   7 
>