在 R 中用 0,1 和 NA 合并列集

Merging sets of columns with 0,1 and NA in R

我有这样的小毛病。

# A tibble: 45 x 10
   `q2-1` `q2-2` `q2-3` `q2-4` `q2-5` `q3-1` `q3-2` `q3-3` `q3-4` `q3-5`
    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
 1      0      1      0      1      1     NA     NA     NA     NA     NA
 2      0      0      0      1      0     NA     NA     NA     NA     NA
 3      0      0      0      0      1     NA     NA     NA     NA     NA
 4      NA     NA     NA     NA     NA     1      1      0      0      1
 5      0      0      0      1      0     NA     NA     NA     NA     NA
 6      0      1      0      0      1     NA     NA     NA     NA     NA
 7      0      0      0      0      1     NA     NA     NA     NA     NA
 8      NA     NA     NA     NA     NA     0      1      0      0      0
 9      0      0      0      1      0     NA     NA     NA     NA     NA
10      0      0      0      0      1     NA     NA     NA     NA     NA

我想合并 q2 和 q3,同时仍保留单独的列。 (例如 q-1、q-2...q-5) 我该怎么做?

(如果您提供了 dput() 输出,我们就不需要重做数据输入。)

您似乎希望将前 5 列中的缺失值替换为第 6-10 列中相应的值,并且更改列的名称以反映该重新排列。所以用is.na()在两边的前五列替换一个索引:

dat <- read.table(text="`q2-1` `q2-2` `q2-3` `q2-4` `q2-5` `q3-1` `q3-2` `q3-3` `q3-4` `q3-5`
     1      0      1      0      1      1     NA     NA     NA     NA     NA
 2      0      0      0      1      0     NA     NA     NA     NA     NA
 3      0      0      0      0      1     NA     NA     NA     NA     NA
 4      NA     NA     NA     NA     NA     1      1      0      0      1
 5      0      0      0      1      0     NA     NA     NA     NA     NA
 6      0      1      0      0      1     NA     NA     NA     NA     NA
 7      0      0      0      0      1     NA     NA     NA     NA     NA
 8      NA     NA     NA     NA     NA     0      1      0      0      0
 9      0      0      0      1      0     NA     NA     NA     NA     NA
 10      0      0      0      0      1     NA     NA     NA     NA     NA", head=T)
dat
   X.q2.1. X.q2.2. X.q2.3. X.q2.4. X.q2.5. X.q3.1. X.q3.2. X.q3.3. X.q3.4. X.q3.5.
1        0       1       0       1       1      NA      NA      NA      NA      NA
2        0       0       0       1       0      NA      NA      NA      NA      NA
3        0       0       0       0       1      NA      NA      NA      NA      NA
4       NA      NA      NA      NA      NA       1       1       0       0       1
5        0       0       0       1       0      NA      NA      NA      NA      NA
6        0       1       0       0       1      NA      NA      NA      NA      NA
7        0       0       0       0       1      NA      NA      NA      NA      NA
8       NA      NA      NA      NA      NA       0       1       0       0       0
9        0       0       0       1       0      NA      NA      NA      NA      NA
10       0       0       0       0       1      NA      NA      NA      NA      NA
 dat1 <- dat[1:5]
 dat2<- dat[6:10]
 dat1[is.na(dat1)] <- dat2[is.na(dat1)]

名称的东西可以用 sub 或 gsub 来完成。

 names(dat1) <- gsub("X[.]","", names(dat1))
 names(dat1) <- gsub("^q\d[.]","q-", names(dat1))
 dat1
#---------------------
   q-1. q-2. q-3. q-4. q-5.
1     0    1    0    1    1
2     0    0    0    1    0
3     0    0    0    0    1
4     1    1    0    0    1
5     0    0    0    1    0
6     0    1    0    0    1
7     0    0    0    0    1
8     0    1    0    0    0
9     0    0    0    1    0
10    0    0    0    0    1

我想你在找 coalesce:

library(dplyr)
library(purrr)

  dat %>% mutate(map2_dfc(across(starts_with('q2')),
                         across(starts_with('q3')),
                         coalesce),
                .keep = 'unused') %>%
         rename_with(~str_remove_all(.x, "(?<=q)\d+"))

  q.1 q.2 q.3 q.4 q.5
1    0   1   0   1   1
2    0   0   0   1   0
3    0   0   0   0   1
4    1   1   0   0   1
5    0   0   0   1   0
6    0   1   0   0   1
7    0   0   0   0   1
8    0   1   0   0   0
9    0   0   0   1   0
10   0   0   0   0   1

数据

structure(list(q2.1 = c(0L, 0L, 0L, NA, 0L, 0L, 0L, NA, 0L, 0L
), q2.2 = c(1L, 0L, 0L, NA, 0L, 1L, 0L, NA, 0L, 0L), q2.3 = c(0L, 
0L, 0L, NA, 0L, 0L, 0L, NA, 0L, 0L), q2.4 = c(1L, 1L, 0L, NA, 
1L, 0L, 0L, NA, 1L, 0L), q2.5 = c(1L, 0L, 1L, NA, 0L, 1L, 1L, 
NA, 0L, 1L), q3.1 = c(NA, NA, NA, 1L, NA, NA, NA, 0L, NA, NA), 
    q3.2 = c(NA, NA, NA, 1L, NA, NA, NA, 1L, NA, NA), q3.3 = c(NA, 
    NA, NA, 0L, NA, NA, NA, 0L, NA, NA), q3.4 = c(NA, NA, NA, 
    0L, NA, NA, NA, 0L, NA, NA), q3.5 = c(NA, NA, NA, 1L, NA, 
    NA, NA, 0L, NA, NA)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))

  q2.1 q2.2 q2.3 q2.4 q2.5 q3.1 q3.2 q3.3 q3.4 q3.5
1     0    1    0    1    1   NA   NA   NA   NA   NA
2     0    0    0    1    0   NA   NA   NA   NA   NA
3     0    0    0    0    1   NA   NA   NA   NA   NA
4    NA   NA   NA   NA   NA    1    1    0    0    1
5     0    0    0    1    0   NA   NA   NA   NA   NA
6     0    1    0    0    1   NA   NA   NA   NA   NA
7     0    0    0    0    1   NA   NA   NA   NA   NA
8    NA   NA   NA   NA   NA    0    1    0    0    0
9     0    0    0    1    0   NA   NA   NA   NA   NA
10    0    0    0    0    1   NA   NA   NA   NA   NA