Замена наблюдений NA, если общее количество наблюдений за год недостаточно - PullRequest
0 голосов
/ 01 октября 2018

У меня есть следующий набор данных:

Year <- c(2000, 2000, 2000, 2000, 2001, 2001, 2001, 2001)
Company_1 <- c(1, 2, 3, NA, 4, 5, 6, 7)
Company_2 <- c(8, 9, NA, NA, 10, 11, 12, 13)
data <- data.frame(Year, Company_1, Company_2) 

Для каждого года я хочу получить количество наблюдений, не относящихся к NA:

data %>% group_by(Year) %>% summarise_all(funs(N = sum(!is.na(.))))

Как видно, вГод 2000, компания 2 имеет только 2 наблюдения.Требование: рассматривать данные за год только в том случае, если общее количество наблюдений в этом году> 2.

Поэтому я хочу заменить эти два наблюдения на NA.

Company_2 станет:

Company_2 <- c(NA, NA, NA, NA, 10, 11, 12, 13)

Не могли бы вы потратить некоторое время, чтобы предложить некоторые решения для этого случая?

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Использование sqldf: внутренний запрос извлекает данные компании за год и суммирует их.И затем по этим сводным данным мы можем проверить, если sum>2, то рассмотреть его, установить еще 0.

library(sqldf)
sqldf("select Year,
      case 
      when a > 2 then a # IF COUNT OF Company_1 > 2 THEN CONSIDER THE VALUE 
      else 0            # ELSE SET IT TO 0
      end a,
      case 
      when b > 2 then b # IF COUNT OF Company_2 > 2 THEN CONSIDER THE VALUE 
      else 0            # ELSE SET IT TO 0
      end b
    from (select Year,count(Company_1) as a,count(Company_2) as b from data group by Year)")

Вывод:

  Year a b
1 2000 3 0
2 2001 4 4
0 голосов
/ 01 октября 2018

Вы можете сделать это, используя пользовательскую функцию и вызывая ее в summarise_all:

my_check <- function(x) { # custom check function
  if (sum(!is.na(x)) > 2){
    sum(!is.na(x))
  }
  else{
    x[!is.na(x)] <- NA
    sum(!is.na(x))
  }
}


library(dplyr)
data %>% group_by(Year) %>% summarise_all(funs(N =  my_check(.) ))
# A tibble: 2 x 3
Year Company_1_N Company_2_N
<dbl>       <int>       <int>
1  2000           3           0
2  2001           4           4

Данные:

Year <- c(2000, 2000, 2000, 2000, 2001, 2001, 2001, 2001)
Company_1 <- c(1, 2, 3, NA, 4, 5, 6, 7)
Company_2 <- c(8, 9, NA, NA, 10, 11, 12, 13)
data <- data.frame(Year, Company_1, Company_2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...