Как сделать Countifs в R - PullRequest
       16

Как сделать Countifs в R

1 голос
/ 27 марта 2019

Данные:

set.seed(42)
df1 = data.frame(
  Date = seq.Date(as.Date("2018-01-01"),as.Date("2018-01-30"),1),
  value = sample(1:30),
  Y = sample(c("yes", "no"), 30, replace = TRUE)
)

df2 = data.frame(
  Date = seq.Date(as.Date("2018-01-01"),as.Date("2018-01-30"),7)
)

Для суммы, если данные попадают в диапазон, это работает ( из моего предыдущего вопроса ):

library(data.table)

df1$start <- df1$Date
df1$end <- df1$Date

df2$start <- df2$Date
df2$end <- df2$Date + 6

setDT(df1, key = c("start", "end"))
setDT(df2, key = c("start", "end"))

d = foverlaps(df1, df2)[, list(mySum = sum(value)), by = Date ]

Как я могу сделать контрафакт?

потому что когда я пытаюсь

d = foverlaps(df1, df2)[, list(mySum = count(value)), by = Date ]

Я получаю ошибку

нет применимого метода для 'groups', примененного к объекту класса "c ('double', 'numeric')"

Ответы [ 4 ]

3 голосов
/ 27 марта 2019

Мы можем использовать .N:

foverlaps(df1, df2)[, list(myCount = .N), by = Date ]
#          Date myCount
# 1: 2018-01-01       7
# 2: 2018-01-08       7
# 3: 2018-01-15       7
# 4: 2018-01-22       7
# 5: 2018-01-29       2
2 голосов
/ 27 марта 2019

Если вы хотите посчитать количество строк на дату, вы можете попробовать .N

foverlaps(df1, df2)[, .(mysum = .N), by = Date ]
         Date mysum
1: 2018-01-01     7
2: 2018-01-08     7
3: 2018-01-15     7
4: 2018-01-22     7
5: 2018-01-29     2

Если вы хотите количество уникальных значений на дату, вы можете попробовать uniqueN()

foverlaps(df1, df2)[, .(mysum = uniqueN(value)), by = Date ]
         Date mysum
1: 2018-01-01     7
2: 2018-01-08     7
3: 2018-01-15     7
4: 2018-01-22     7
5: 2018-01-29     2

И .N, и uniqueN() из {data.table}.

2 голосов
/ 27 марта 2019
d = foverlaps(df1, df2)[, .N, by = Date]
1 голос
/ 27 марта 2019

Вместо list(mySum = count(value)) попробуйте c(mySum = count(value)). Код работает для меня тогда.

d2 <-  foverlaps(df1, df2)[, c(mySum = count(value)), by = Date ]
...