Количество строк по идентификатору группы условное - PullRequest
0 голосов
/ 05 августа 2020

У меня есть такой фрейм данных:

  ID S1 C
1 1  2  3  
2 1  2  3
3 3  1  1
4 6  2  5
5 6  7  5

Мне нужно количество строк в группе ID где S1 <= C. Это желаемый результат.

  ID  Obs 
1 1   2 
2 3   1 
3 6   1 

Хотя на вопрос был дан ответ ниже, у меня есть следующий вопрос: можно ли сделать то же самое для нескольких столбцов (S1, S2, ..). Например, для кадра данных ниже:

  ID S1  S2 C
1 1  2   2  3  
2 1  2   2  3
3 3  1   1  1
4 6  2   2  5
5 6  7   7  5

А затем получите:

  ID  S1.Obs S2.Obs 
1 1   2      2
2 3   1      1
3 6   1      1

Ответы [ 3 ]

1 голос
/ 05 августа 2020
data <- data.frame(
  ID = c(1, 1, 3, 6, 6),
  S1 = c(2, 2, 1, 2, 7),
  C = c(3, 3, 1, 5, 5)
)

library(dplyr)

data.filtered <- data[data$S1 <= data$C,]

data.filtered %>% group_by(ID) %>%
  summarize(Obs = length(ID))
1 голос
/ 05 августа 2020

A base R раствор с aggregate().

aggregate(Obs ~ ID, transform(df, Obs = S1 <= C), sum)

#   ID Obs
# 1  1   2
# 2  3   1
# 3  6   1

A dplyr раствор

library(dplyr)

df %>%
  filter(S1 <= C) %>%
  count(ID, name = "Obs")

#   ID Obs
# 1  1   2
# 2  3   1
# 3  6   1

Данные

df <- structure(list(ID = c(1L, 1L, 3L, 6L, 6L), S1 = c(2L, 2L, 1L, 2L, 7L),
C = c(3L, 3L, 1L, 5L, 5L)), class = "data.frame", row.names = c("1", "2", "3", "4", "5"))

Расширение

Если вы хотите применить это правило к нескольким столбцам, таким как S1, S2, S3:

df %>%
  group_by(ID) %>%
  summarise(across(starts_with("S"), ~ sum(.x <= C)))
0 голосов
/ 05 августа 2020

Вариант с data.table

library(data.table)
setDT(df)[S1 <=C, .(Obs = .N), ID]
#   ID Obs
#1:  1   2
#2:  3   1
#3:  6   1

данными

df <-  structure(list(ID = c(1L, 1L, 3L, 6L, 6L), S1 = c(2L, 2L, 1L, 2L, 7L),
C = c(3L, 3L, 1L, 5L, 5L)), class = "data.frame", row.names = c("1", "2", "3", "4", "5"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...