我有一个数据集,如下所示:
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)
您介意请花费一些时间为这种情况提供一些解决方案吗?
答案 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