拿这段代码:
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
一次? dplyr
或magrittr
可以实现此目标吗?
答案 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))