使用 dplyr 在多个字段中用 NA 替换小于值

Replacing less than value with NA across multiple fields using dplyr

我正在处理一个数据框,其中包含对调查问题的回答(记录为二分二进制变量)。我想根据他们对人口统计问题的回答来对一个调查问题的答案进行分层。出于隐私原因,我想抑制所有 <5 名参与者回复的答案(来自 0、1 和 NA)。

我已经使用适用于交叉表的 dplyr 编写了代码,但我无法将数据抑制步骤作为我的管道命令的一部分。我在此处包括我的代码和示例当前和所需的输出 tables,有人有建议吗?

crosstab.demo <- df %>% 
  select(c(answer_var, demo_var)) %>%
  group_by(answer_var) %>%
  count(demo_var) %>%
  pivot_wider(names_from = answer_var, values_from = n)

当前输出 table,其中 NA 是由于跳过了调查问题。

demo_var 0 1 NA
demo1 76 182 47
demo2 378 717 210
demo3 3 9 2
demo4 4 2 1
NA 23 29 13

期望的输出

demo_var 0 1 NA
demo1 76 182 47
demo2 378 717 210
demo3 NA 9 NA
demo4 NA NA NA
NA 23 29 13

谢谢!

在你这边table,你可以在mutate():

里面使用across()
library(tidyverse)
read.table(header=T, text="
demo_var    0   1   NA
demo1   76  182 47
demo2   378 717 210
demo3   3   9   2
demo4   4   2   1
NA  23  29  13") %>% 
  mutate(across(-demo_var, ~ifelse(.x<=5, NA, .x)))
#>   demo_var  X0  X1 NA.
#> 1    demo1  76 182  47
#> 2    demo2 378 717 210
#> 3    demo3  NA   9  NA
#> 4    demo4  NA  NA  NA
#> 5     <NA>  23  29  13

reprex package (v2.0.1)

创建于 2022-03-15

由于我们无法访问 df,因此很难给出最佳答案。对于您以后的问题,请使用 dput(df).

提供您的数据集

因此,此代码也可能有效,但我无法对其进行测试:

crosstab.demo <- df %>% 
  select(c(answer_var, demo_var)) %>%
  group_by(answer_var) %>%
  count(demo_var) %>%
  mutate(n=ifelse(n<=5, NA, n) %>%
  pivot_wider(names_from = answer_var, values_from = n)