按日期求和"如果"声明

时间:2017-12-27 17:19:20

标签: r if-statement

我试图使用" 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)
}

然而,输出是&#34; 31&#34;而不是&#34; 7&#34;正如我所料。是否有更好的方法按日期求和?我想使用&#34; if&#34;声明,因为我想将它应用于具有许多不同列并且在不同时间长度内的更大的数据集。

5 个答案:

答案 0 :(得分:2)

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

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

如果&#39; nums&#39;的价值不是全部1,然后将“nums”和“基于逻辑向量并得到总和`

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

答案 1 :(得分:1)

update

答案 2 :(得分:1)

只需使用此功能:

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')

答案 3 :(得分:1)

R中的if - 函数没有矢量化,而且#34;&amp;&amp;&#34; -operator也没有。采用逻辑子集的常用方法是向量化运算符&#34;&amp;&#34;并把它放在&#34; [&#34;:

的第一个参数中
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

答案 4 :(得分:1)

...并说明了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
>