这是个新手问题。
我有一个数据框架,其中包括所有的在线调查的答复,总共在89列。
由于在线调查有时填写的人谁不真正关心,谁只是把响应值很容易填写,我想过滤掉令人难以置信的行,有人简单地击中一个极值一遍又一遍.
我想过滤掉这些列都具有值“9”或都具有值“1”的行:
- “社交关系强”
- “社交关系薄弱”
- '社会_关系_二阶'
- '社会身份生活方式'
- “社会身份政治”
- “社会垂直社会资本”
- “社会垂直网络资本”
下面是我的代码(包括tidyverse和dplyr包):
data-cleaned <- data_raw %>%
fdaten_bereinigt <- rohdaten_basis %>%
filter(sociald_ties_strong == 9 & sociald_ties_weak == 9 & sociald_ties_secondorder == 9 & sociald_identity_lifestyle == 9 & sociald_identity_politics == 9 & sociald_vertical_socialcapital == 9 & sociald_vertical_networkcapital == 9) %>%
filter(sociald_ties_strong == 1 & sociald_ties_weak == 1 & sociald_ties_secondorder == 1 & sociald_identity_lifestyle == 1 & sociald_identity_politics == 1 & sociald_vertical_socialcapital == 1 & sociald_vertical_networkcapital == 1)
但是,我似乎在逻辑和/或语法中遗漏了一些东西,因为这会过滤掉许多行。
我的数据清理将包括更多类似上面的条件字符串,以排 debugging 误的或自动化的行,但首先我想学习如何正确处理。
可能是两个(或更多)过滤器管道在一起不是一个好主意的方式,我这样做?任何建议,欢迎!
我期望过滤掉满足所有条件的少数行,可能占总观察值的0.5%。
3条答案
按热度按时间62lalag41#
你的代码有几个问题。首先,你有两个任务在你的管道中:
我假设这是个错误否则,你想干什么就不清楚了
第二,
filter()
* 保留满足条件的值,并删除其他所有值。因此,当前第一个filter()
* 只保留所有值都为9
的行。然后,第二个filter()
只查找所有值都为1
的行-其中没有行,因为这些行已在上一步中删除-因此,您将得到一个空 Dataframe 。要获得您想要的结果,请使用
!()
对条件求反:第三,使用
dplyr::if_all()
可以更简洁地完成此操作:ljo96ir52#
你可以创建一个你想要检查的变量向量,然后使用
filter(if_all(all_of(VECTOR), ~.x != 1) & if_all(all_of(VECTOR), ~.x != 9))
7vux5j2d3#
当很难弄清楚在
dplyr
中要做什么时,通常将数据重新塑造成不同的形式会更容易。可以使用
pivot_longer
将数据放入长格式:现在,通过group by和filter,它变得相当简单:
最后,您可以将数据移回原始表单: