想要在向量中找到NA的最小值,但是给我NA而不是数字

时间:2018-03-21 22:32:27

标签: r

我正在根据两位读者所说的确定最终年龄。我希望我的代码有条件地确定最终年龄:(1)如果两个年龄相同,最终年龄将采用agea,(2)如果两个年龄相差一年,最终年龄将是较低年龄,(3)如果这两个年龄相差两年,最终年龄将是平均年龄,(4)如果这两个年龄相差超过两年,那就是“一次性”。

它适用于大多数情况,但是当我有一个年龄为NA时,它只是给了我NA,我希望最终年龄变成非NA年龄。

这就是我的数据的样子,用逗号分隔列:

[1] age_a, age_k   
[2] 6, 6  
[3] 8, 7  
[4] 6, 6   
[5] 10, 10  
[6] 6, 7  
[7] 15, 6  
[8] 13, NA

这是我的代码(“ka_ages”是我为rowMeans函数组合agea和agek创建的向量):

ka_final <- case_when(  
agea == agek ~ agea,  
abs(agek - agea) == 1 ~ pmin(agea, agek, na.rm = TRUE),
abs(agek - agea) == 2 ~ rowMeans(ka_ages),  
abs(agek - agea) > 2 ~ NA_real_
)

现在代码运行时我的数据是什么样的:

[1] ka_final  
[2] 6
[3] 7
[4] 6
[5] 10
[6] 6
[7] NA
[8] NA

所以,[7]是我想要的,但[8]不是 - 我希望它采用数字,而不是NA。这是正确的功能吗?

1 个答案:

答案 0 :(得分:1)

由于最后一行中的age_kNA,所有比较都会返回NA,并且您的案例陈述不会返回任何内容(因此NA)。

你需要在

的行中添加一个子句
sum(is.na(c(agek, agea)))>0 ~ min(agek, agea, na.rm=TRUE)

最终案例陈述:

ka_final <- case_when(  
            agea == agek ~ agea,  
            abs(agek - agea) == 1 ~ pmin(agea, agek, na.rm = TRUE),
            abs(agek - agea) == 2 ~ rowMeans(df),  
            abs(agek - agea) > 2 ~ NA_real_,
            sum(is.na(c(agek, agea)))>0 ~ min(agek, agea, na.rm=TRUE)
)