【发布时间】:2020-03-02 21:06:00
【问题描述】:
我有一个包含约 100 个变量和数千个观察值的数据框。由于某些变量中的值,其中一些观察结果不符合进一步分析的条件。我想创建一个字符变量,而不是仅仅删除这些不合格的观察结果,以指示如果观察结果已不合格,如果是,因为哪些变量(由于多个变量,一个观察结果可能会被取消资格)。
大多数变量都是数字变量,可以具有以下值之一:-1、0、1。除此之外,可能使观察不合格的变量也可以取值99,这意味着不合格。
# create example data
df <- data.frame(id = c(1:6),
AA_B = c(1, 0, NA, 1, -1, 99),
A_B_C = c(0, 0, 0, -1, 1, NA),
A_BB = c(-1, 99, 0, 0, -1, NA),
B_C = c(99, NA, 1, 99, 0, 99),
D_AC = c(1, 1, 1, 1, -1, -1))
如果观察结果不合格,则新变量“disqualify”应该类似于Disqualified because of A_BB 或Disqualified because of AA_B and B_C(取决于导致不合格的变量),否则它可以是任何其他字符串或只是NA。因此,结果应如下所示:
> df
id AA_B A_B_C A_BB B_C D_AC disqualify
1 1 1 0 -1 99 1 Disqualified because of B_C
2 2 0 0 99 NA 1 Disqualified because of A_BB
3 3 NA 0 0 1 1 <NA>
4 4 1 -1 0 99 1 Disqualified because of B_C
5 5 -1 1 -1 0 -1 <NA>
6 6 99 NA NA 99 -1 Disqualified because of AA_B and B_C
我正在努力寻找一种方法来自动将导致取消资格的那些变量的变量名称包含在“取消资格”字符串中。到目前为止,我已经找到了以下解决方案,但这是一种可怕的代码和平,我相信一定有更好的方法来做到这一点。
df <-
df %>%
mutate(disqualify = case_when(AA_B == 99 |
A_BB == 99 |
B_C == 99 ~ paste("Disqualified because of",
case_when(AA_B == 99 & (is.na(A_BB) | A_BB != 99) & (is.na(B_C) | B_C != 99) ~ deparse(substitute(AA_B)),
AA_B == 99 & A_BB == 99 & (is.na(B_C) | B_C != 99) ~ paste(deparse(substitute(AA_B)), deparse(substitute(A_BB)), sep = " and "),
AA_B == 99 & A_BB == 99 & B_C == 99 ~ paste(deparse(substitute(AA_B)), deparse(substitute(A_BB)), deparse(substitute(B_C)), sep = " and "),
AA_B == 99 & (is.na(A_BB) | A_BB != 99) & B_C == 99 ~ paste(deparse(substitute(AA_B)), deparse(substitute(B_C)), sep = " and "),
(is.na(AA_B) | AA_B != 99) & A_BB == 99 & B_C == 99 ~ paste(deparse(substitute(A_BB)), deparse(substitute(B_C)), sep = " and "),
(is.na(AA_B) | AA_B != 99) & A_BB == 99 & (is.na(B_C) | B_C != 99) ~ deparse(substitute(A_BB)),
(is.na(AA_B) | AA_B != 99) & (is.na(A_BB) | A_BB != 99) & B_C == 99 ~ deparse(substitute(B_C))
))))
如果可能的话,我更喜欢 dplyr 解决方案,它允许我通过变量名称调用不合格变量(无索引)。
而且,最重要的是,如果有办法将我的输出变量中的变量名替换为另一个字符串,那就太好了。所以Disqualified because of A_BB 可以变成Disqualified because of Weather。
感谢任何帮助!
【问题讨论】:
标签: r string dplyr conditional-statements