2017-12-27 528 views
0

我想在數據框中使用「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

回答

2

我們可以在邏輯矢量上做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'。 –

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

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