R语言 如何在不比较NA的情况下比较列之间值的相等性?

u0sqgete  于 2023-02-27  发布在  其他
关注(0)|答案(2)|浏览(196)

我想比较数据框第一行中的值是否匹配,作为回报,我想得到1表示TRUE,0表示FALSE,我只尝试在第一行工作,因为稍后我想为数据框的所有1000行编写一个for循环。
这是我正在处理的第一行。

illness_1 illness_2 illness_3 illness_4 illness_5 illness_6 illness_7
1      1065      1139        NA        NA        NA        NA        NA
  illness_8 illness_9 illness_10 illness_11 illness_12 illness_13 DC1 DC2 DC3
1        NA        NA         NA         NA         NA         NA  42  NA  NA
  DC4 DC5 DC6 DC7 DC8 DC9 DC10 DC11 DC12 DC13 DC14 DC15 DC16 DC17 DC18 DC19 DC20
1  NA  NA  NA  NA  NA  NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
  DC21 DC22 DC23 DC24 DC25 DC26 DC27 DC28 DC29 DC30 DC31 DC32 DC33 DC34 DC35
1   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
  DC36 DC37 DC38 DC39 DC40 DC41 DC42 DC43 DC44 DC45 DC46 DC47 DC48 DC49 DC50
1   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
  DC51 DC52 DC53 DC54 DC55 DC56 DC57 DC58 DC59 DC60 DC61 DC62 DC63 DC64 DC65
1   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
  DC66 DC67 DC68 DC69 DC70 DC71 DC72 DC73 DC74 DC75 DC76 DC77 DC78 DC79 DC80
1   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
  DC81 DC82 DC83 DC84 DC85 DC86 DC87 DC88 DC89 DC90 DC91 DC92 DC93 DC94 DC95
1   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
  DC96 DC97 DC98 DC99 DC100
1   NA   NA   NA   NA    NA

我试过下面的代码。

ifelse(
  any(
    !is.na(dplyr::select(data_set, contains("illness")))
  ) ==
    any(
      !is.na(dplyr::select(data_set, contains("DC")))
    ), 1, 0
)

它返回了一个1,而我期待的是一个0。
有人能帮忙吗?先谢了。

kgqe7b3p

kgqe7b3p1#

使用dplyr::rowwise()c_across()比较列集,在比较之前,借助purrr::discard()删除NA

library(dplyr)
library(purrr)

dat %>% 
  rowwise() %>% 
  mutate(check = any(
    discard(c_across(contains("illness")), is.na) %in%
    discard(c_across(contains("DC")), is.na)
  )) %>% 
  ungroup()
# A tibble: 3 × 7
  illness_1 illness_2 ilnness_3   DC1   DC2   DC3 check
      <dbl>     <dbl>     <dbl> <dbl> <dbl> <dbl> <lgl>
1         1         4        NA    NA     1    98 TRUE 
2         2        NA         8    99    NA    97 FALSE
3        NA        NA        NA     2    NA    NA FALSE
  • 示例数据:*
dat <- data.frame(
  illness_1 = c(1, 2, NA),
  illness_2 = c(4, NA, NA),
  ilnness_3 = c(NA, 8, NA),
  DC1 = c(NA, 99, 2),
  DC2 = c(1, NA, NA),
  DC3 = c(98, 97, NA)
)
fjaof16o

fjaof16o2#

对于数据框df中的所有行,检查包含 illness 的列中的值是否与包含 DC 的列中的值相交(不包括NA)。返回1或0。

ill <- grepl("illness", colnames(df))
dc <- grepl("DC", colnames(df))

apply(df, 1, function(x) 
  (length(na.omit(intersect(as.numeric(unlist(x[ill])), 
                            as.numeric(unlist(x[dc]))))) > 0) * 1)

相关问题