簡體   English   中英

R - 組內的和,僅當另一個變量具有連續值時

[英]R - Sum within group and only if another variable has consecutive values

我有一個數據框,其中每一行都是特定月份的公司。 我有兩列:金額和交易數量。 我需要確定那些在金額列中至少有150.0並且在交易數量上至少有11個列的公司,這是三個月的。 我有大約50個月的觀察。

在Stata中,我所做的是按id和month對數據進行排序,然后詢問三個月的總和是否高於條件。 這是通過使用Stata的[_n]功能完成的:將數據排序並進行觀察[_n],我知道觀察[_n-1]在前一個月是同一家公司:

by id: replace auxactivado = 1 if auxactivado != 1 & !missing(amount) & ///
(amount[_n] + amount[_n-1]) > 150.00 & !missing(transac) & ///
(transac[_n] + transac[_n-1]) >= 10 & (mes[_n] == (mes[_n-1] + 1) | mes[_n] == 1 & mes[_n-1] == 12 & ao[_n] != ao[_n-1])

在上面的Stata代碼中,我檢查是否在兩個月內滿足條件,例如(我還檢查年份變化;在下面的數據中,我創建了一個輔助月份,為此進行調整,因此無需再進行此調整) 。

我想在R中這樣做,但不知道如何。 我已經在網上廣泛查看但無法提出解決方案。 任何想法將不勝感激

month   year   monthaux           id    amount  transac
    2   2019         26      1201857     301.0     7
    3   2019         27      1201857     423.9     9
    4   2019         28      1201857     684.7    10
    5   2019         29      1201857     494.1     6
    4   2018         16      1202268     51       13
    5   2018         17      1202268     80       15
    2   2019         26      1202268     20       53
    6   2017          6      1202545     102.97    6
    7   2017          7      1202545     2429.6    1
    8   2017          8      1202545     1735.0    1

這是我的數據,以防我不清楚。 請注意,月份並不總是連續的:我只需要連續幾個月檢查一下情況。

我想id 1201857顯示為1(符合條件),1202268為0(滿足交易但不是因為無連續月份的金額)和1202545為0(符合金額,不符合交易條件)

編輯:eastclintw00d一直在幫助我,這種數據存在一些問題,這些條件在兩個月內得到滿足。

id  month   year    amount  transac
2068814 9   2016    151.18  5
2068814 10  2016    206.36  7

2037434 8   2018    85.43   1
2037434 10  2018    744.91  4
2037434 11  2018    630.8   6
2037434 1   2019    596.33  3


structure(list(id = c(2068814L, 2068814L, 2037434L, 2037434L, 
2037434L, 2037434L, 2037434L, 2037434L, 2037434L, 2037434L, 2037434L, 
2037434L, 2037434L, 2037434L, 2037434L, 2037434L, 2037434L, 2037434L, 
2037434L, 2037434L, 2037434L, 2037434L), ao = c(2016L, 2016L, 
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2019L, 2019L, 
2019L, 2019L), mes = c(9L, 10L, 7L, 8L, 9L, 10L, 11L, 12L, 1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 10L, 11L, 1L, 3L, 4L, 5L), importe_dol = c(151.18, 
206.36, 268.85, 299.97, 63.99, 797.27, 525, 643.15, 108.58, 128.21, 
452.24, 403.25, 92, 1003.45, 158.96, 85.43, 744.91, 630.8, 596.33, 
574.02, 80.50351324, 444.9815415), cant_transac = c(5, 7, 2, 
1, 1, 2, 1, 2, 1, 1, 3, 1, 1, 3, 1, 1, 4, 6, 3, 4, 1, 3)), row.names = c(45L, 
811L, 10507L, 12459L, 15487L, 16601L, 19590L, 22927L, 27284L, 
30505L, 33036L, 36794L, 41810L, 43778L, 49722L, 54720L, 61910L, 
67047L, 77803L, 89001L, 97082L, 100933L), class = "data.frame")

假設您的表被稱為df嘗試:

library(dplyr)
df  %>% 
  group_by(id, year, trimester = ceiling(month / 4)) %>% 
  summarise_at(vars(transac, amount), sum) %>% 
  mutate(criterion = if_else(transac >= 11 & amount >= 150, 1, 0))

鑒於您對三個月的澄清,以下代碼應該可以解決問題。 我首先創建三個關鍵變量的笛卡爾積,然后將數據幀加入其中。 我創建了相關變量的第1和第2滯后,並檢查它們是否符合標准。 最后,我過濾您正在尋找的那些條目。

library(dplyr)
library(tidyr)
crossing(
  data.frame(ao = min(df$ao):max(df$ao)),
  data.frame(mes = 1:12),
  data.frame(id = unique(df$id))
) %>% 
  left_join(df %>% mutate(original = 1), by = c("ao", "mes", "id")) %>% 
  arrange(id, ao, mes) %>% 
  mutate(
    cant_transac2 = if_else(id == lag(id), lag(cant_transac), NA_real_), 
    cant_transac3 = if_else(id == lag(id, 2), lag(cant_transac, 2), NA_real_), 
    importe_dol2 = if_else(id == lag(id), lag(importe_dol), NA_real_), 
    importe_dol3 = if_else(id == lag(id, 2), lag(importe_dol, 2), NA_real_), 
  ) %>% 
  replace_na(list(cant_transac2 = 0, cant_transac3 = 0, importe_dol2 = 0, importe_dol3 = 0)) %>% 
  mutate(criterion = if_else(cant_transac + cant_transac2 + cant_transac3 >= 11 & importe_dol + importe_dol2 + importe_dol3 >= 150, 1, NA_real_)) %>% 
  filter(original == 1) %>% 
  select(-original, -cant_transac2, -cant_transac3, -importe_dol2, -importe_dol3)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM