如果一年中的观测总数不够用NA替换观测

时间:2018-10-01 04:06:39

标签: r dplyr missing-data

我有一个数据集,如下所示:

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 :(得分:0)

您可以通过使用自定义函数并在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)

答案 1 :(得分:0)

使用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