【发布时间】:2020-12-31 14:36:18
【问题描述】:
我正在学习 R 并在这里寻找最佳实践...
主要问题
鉴于标题my_tibble:
# A tibble: 5 x 3
chkA chkB chkC
<chr> <chr> <chr>
1 NA NA NA
2 x NA NA
3 NA x NA
4 x NA NA
5 NA NA x
我想创建一个变量/列checked,指定变量chkA、chkB 或chkC 中的哪一个等于"x"。对于每个观察/行,这三个变量中只有零个或一个可以等于"x",而其余的都是NA。
我可以用这段代码解决它:
my_tibble <- my_tibble %>% mutate(checked = case_when(
chkA == "x" ~ "A",
chkB == "x" ~ "B",
chkC == "x" ~ "C",
TRUE ~ "(none)"
))
,它会产生这个小标题:
# A tibble: 5 x 4
chkA chkB chkC checked
<chr> <chr> <chr> <chr>
1 NA NA NA (none)
2 x NA NA A
3 NA x NA B
4 x NA NA A
5 NA NA x C
但是,我认为/希望有一个更方便/优雅的解决方案,可能是单线或其他什么,因为我认为这是一个常见的问题。
奖励/后续问题
对于“更清洁”的小标题,我可能想通过转换为 lgl 变量来摆脱 chr 变量及其NAs。我用这段代码解决了这个问题:
my_tibble <- my_tibble %>% mutate(chkA = ifelse(is.na(chkA), FALSE, TRUE))
my_tibble <- my_tibble %>% mutate(chkB = ifelse(is.na(chkB), FALSE, TRUE))
my_tibble <- my_tibble %>% mutate(chkC = ifelse(is.na(chkC), FALSE, TRUE))
,创建这个小标题:
# A tibble: 5 x 3
chkA chkB chkC
<lgl> <lgl> <lgl>
1 FALSE FALSE FALSE
2 TRUE FALSE FALSE
3 FALSE TRUE FALSE
4 TRUE FALSE FALSE
5 FALSE FALSE TRUE
有没有更好的办法?
【问题讨论】: