如何在数据框中每n个月应用一个函数?

时间:2018-03-05 18:03:51

标签: r

我有一个这样的数据框:

Month   Amount
1/31/2014   793
2/28/2014   363
3/31/2014   857
4/30/2014   621
5/31/2014   948
6/30/2014   385

我想将函数(x * 0.5)应用于此数据框中的第三行和第六行。结果将覆盖数据框中当前的数据。所以最终结果如下:

Month   Amount
1/31/2014   793
2/28/2014   363
3/31/2014   428.5
4/30/2014   621
5/31/2014   948
6/30/2014   192.5

我已尝试过rollapply()函数,但该函数似乎从第一行开始,但没有强制它从第三行开始的选项。

我真的很感激这方面的任何帮助。提前谢谢。

3 个答案:

答案 0 :(得分:1)

假设您的data.frame名为DT:

DT$Amount[c(3,6)] <- 0.5 * DT$Amount[c(3,6)]

如果您有大量数据,请使用data.table:

setDT(DT)
DT[
  month(as.Date(Month, format = "%m/%d/%Y")) %% 3 == 0, 
  Amount := 0.5 * Amount
]

答案 1 :(得分:0)

如果行遵循模式,则%%可用于选择每个x

df1$Amount[seq_len(nrow(df1)) %% 3 == 0] <- df1$Amount[seq_len(nrow(df1)) %% 3 == 0] * 0.5

      Month Amount
1 1/31/2014  793.0
2 2/28/2014  363.0
3 3/31/2014  428.5
4 4/30/2014  621.0
5 5/31/2014  948.0
6 6/30/2014  192.5

答案 2 :(得分:0)

检测较大数据集中特定月份的替代方法是使用month中的lubridate()

  month ammount
1 1/31/2014     793
2 2/28/2014     363
3 3/31/2014     857
4 4/30/2014     621
5 5/31/2014     948
6 6/30/2014     385

library(lubridate)

df %>% mutate(month = as.Date(month, "%m/%d/%Y"),
         date_month = month(month),
         new_ammount =  ifelse(date_month %in% c(3,6), ammount*0.5, ammount))

提供

     month ammount date_month new_ammount
1 2014-01-31     793          1       793.0
2 2014-02-28     363          2       363.0
3 2014-03-31     857          3       428.5
4 2014-04-30     621          4       621.0
5 2014-05-31     948          5       948.0
6 2014-06-30     385          6       192.5