缩短代码以过滤数据

时间:2014-08-22 18:34:58

标签: r filtering

拿这段代码:

quite_long_data_frame_name <- data.frame(variable.name = rnorm(50, 3, 2))

quite_long_data_frame_name$variable.name[quite_long_data_frame_name$variable.name > 2 & quite_long_data_frame_name$variable.name < 3] <- NA

在最后一行中,quite_long_data_frame_name$variable.name需要重复3次。有没有办法达到相同的结果但只使用quite_long_data_frame_name$variable.name一次? dplyrmagrittr可以实现此目标吗?

2 个答案:

答案 0 :(得分:1)

使用subset并取消该逻辑向量:

subset( quite_long_data_frame_name, !(variable.name > 2 & variable.name < 3) )

如果您想要破坏性地修改原件,请将该值分配给原件。

如果您真的想要NA的结果:

within( quite_long_data_frame_name, is.na(variable.name) <- 
                                     (variable.name > 2 & variable.name < 3) )

如果您希望此结果替换原始结果,则需要分配回very_long_data_frame_name。

答案 1 :(得分:1)

dplyr,我想你会做

quite_long_data_frame_name %>%
mutate(variable.name=ifelse(variable.name>2 & variable.name<3, NA, variable.name))

现在您只需键入一次数据帧名称,但您必须键入变量名称4次而不是3.如果变量名称与数据帧名称相比较短,则可以提供帮助。不幸的是,我不再想到简洁的dplyr解决方案。

作为attach解决方案的替代方案,请使用with

with(quite_long_data_frame_name, variable.name[variable.name > 2 & variable.name < 3] <- NA)

还很长。如果不至少输入variable.name至少3次,我不知道有什么方法可以做到这一点。

给你的变量更短的名字? :)

请注意,如果您想要实际过滤(在dplyr意义上),则更容易

quite_long_data_frame_name %>%
filter(variablename > 2 & variablename < 3)

但基数R也较短。

=====编辑==========

此特定条件,您可以使用%between%包中的data.table运算符。更短,但不是很一般。在这里汇总所有内容,我们得到

with(quite_long_data_frame_name, is.na(variable.name) <- variable.name %between% c(2, 3))