使用“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”语句,因为我想将其应用于具有许多不同列且时间长度不同的更大的数据集。

回答:

我们可以在逻辑矢量上做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")]) 

回答:

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

>

以上是 使用“if”语句按日期求和 的全部内容, 来源链接: utcz.com/qa/266561.html

回到顶部