在 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
我有这样的小毛病。
# 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