使用 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)
我正在处理一个数据框,其中包含对调查问题的回答(记录为二分二进制变量)。我想根据他们对人口统计问题的回答来对一个调查问题的答案进行分层。出于隐私原因,我想抑制所有 <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)