我可以使用dplyr和<=和> =运算符创建一个新的数值变量,以对现有向量的值进行子集化吗?

时间:2019-04-04 11:50:15

标签: r dplyr

我有一个变量,其值的范围非常大。我想在数据框中创建一个新变量,该变量构成这些值的子集,所有原始值不在该子集的指定范围内,列为NA。我曾尝试使用dplyr中的mutate来做到这一点,但返回的变量是逻辑向量。

例如,对于mtcars,我已经尝试过:

test <- mtcars %>% 
  mutate(mpg_subset = mpg<=22) %>% 
  mutate(mpg_subset=mpg_subset>=18)

在这里,我想要一个名为mpg_subset的新数值变量,它仅包含mpg为<= 22和> = 18的那些值,并且所有不在这些范围内的值都标记为NA。

不幸的是,我得到的是mpg_subset的逻辑矢量,它告诉我mpg的原始值是否满足这些条件(TRUE或FALSE),而不是数值矢量。我也尝试使用过滤器功能,但是得到了相同的结果。我是dplyr的新手,所以我不确定自己做错了什么!

有人可以建议我如何获取所需数据吗?

非常感谢您!

3 个答案:

答案 0 :(得分:3)

希望突变中的ifelse可以解决问题。

test <- mtcars %>% 
  mutate(mpg_subset = ifelse(mpg<=22 & mpg >=18, mpg, NA))

答案 1 :(得分:2)

尝试一下:

library(dplyr)
test <- mtcars %>% 
  mutate(mpg_subset = case_when(between(mpg,18,22) ~ mpg))

答案 2 :(得分:2)

我知道您指定了dplyr,但是如果有人对data.table解决方案感兴趣,它会使用ifelse语句...

as.data.table(mtcars)[, mpg_subset := ifelse(mpg <= 22 & mpg >= 18, mpg, NA)]

您可能可以使用dplyr做类似的事情。