在R中处理行式NA

k2fxgqgv  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(150)

以下是一个示例数据集:
| A类|B|C级|D级|E级|F级|G级|高|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 一百二十三|某某|美国广播公司|某某|美国广播公司|某某|美国广播公司|某某|
| 一百二十三|某某|美国广播公司|某某|美国广播公司|不适用|美国广播公司|某某|
| 一百二十三|不适用|美国广播公司|某某|美国广播公司|某某|美国广播公司|某某|
| 一百二十三|某某|不适用|某某|美国广播公司|某某|美国广播公司|美国广播公司|
| 三四五|一分钟|不适用|某某|美国广播公司|某某|美国广播公司|电子重力仪|
| 三四五|一分钟|第一|某某|美国广播公司|某某|美国广播公司|不适用|
| 五六七|一分钟|第一|某某|美国广播公司|某某|美国广播公司|不适用|
| 五六七|一分钟|第一|不适用|美国广播公司|某某|美国广播公司|第一|
| 五六七|一分钟|第一|某某|美国广播公司|某某|不适用|第一|
我想创建一个名为“filter”的列,如果:
1.该行没有NA,则为1
1.该行从列B到D具有NA,然后是2
1.该行从列F到H具有NA,然后为3
我在考虑mutatecase_when代码,但我不知道如何去做。

w6mmgewl

w6mmgewl1#

来自dplyrif_any()if_all()可以将相同的 predicate 函数应用于所选列,并将结果组合成单个逻辑向量。

library(dplyr)

df %>%
  mutate(filter = case_when(
    !if_any(A:H, is.na) ~ 1L,
     if_any(B:D, is.na) ~ 2L,
     if_any(F:H, is.na) ~ 3L
  ))

# # A tibble: 9 × 9
#       A B     C     D     E     F     G     H     filter
#   <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr>  <int>
# 1   123 xyz   abc   xyz   abc   xyz   abc   xyz        1
# 2   123 xyz   abc   xyz   abc   NA    abc   xyz        3
# 3   123 NA    abc   xyz   abc   xyz   abc   xyz        2
# 4   123 xyz   NA    xyz   abc   xyz   abc   abc        2
# 5   345 lmn   NA    xyz   abc   xyz   abc   efg        2
# 6   345 lmn   rst   xyz   abc   xyz   abc   NA         3
# 7   567 lmn   rst   xyz   abc   xyz   abc   NA         3
# 8   567 lmn   rst   NA    abc   xyz   abc   rst        2
# 9   567 lmn   rst   xyz   abc   xyz   NA    rst        3
数据
df <- read.table(text = "A B C D E F G H
123 xyz abc xyz abc xyz abc xyz
123 xyz abc xyz abc NA abc xyz
123 NA abc xyz abc xyz abc xyz
123 xyz NA xyz abc xyz abc abc
345 lmn NA xyz abc xyz abc efg
345 lmn rst xyz abc xyz abc NA
567 lmn rst xyz abc xyz abc NA
567 lmn rst NA abc xyz abc rst
567 lmn rst xyz abc xyz NA rst", header = TRUE)
wgxvkvu9

wgxvkvu92#

可以在rowwise之后使用c_across来指定列。

library(dplyr)

df %>% rowwise() %>% 
  mutate(filter = case_when(sum(is.na(c_across(B:H))) == 0 ~ "1",
                            sum(is.na(c_across(B:D))) >= 1 ~ "2",
                            sum(is.na(c_across(F:H))) >= 1 ~ "3")) %>% 
  ungroup()

# A tibble: 9 × 9
      A B     C     D     E     F     G     H     filter
  <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 
1   123 xyz   abc   xyz   abc   xyz   abc   xyz   1     
2   123 xyz   abc   xyz   abc   NA    abc   xyz   3     
3   123 NA    abc   xyz   abc   xyz   abc   xyz   2     
4   123 xyz   NA    xyz   abc   xyz   abc   abc   2     
5   345 lmn   NA    xyz   abc   xyz   abc   efg   2     
6   345 lmn   rst   xyz   abc   xyz   abc   NA    3     
7   567 lmn   rst   xyz   abc   xyz   abc   NA    3     
8   567 lmn   rst   NA    abc   xyz   abc   rst   2     
9   567 lmn   rst   xyz   abc   xyz   NA    rst   3

相关问题