我有一个创建多列的数据集,但是数据是相同的(boxID)。我想统一这些列,以便仅拥有boxID(字母数字代码:两个字母的状态缩写和2个数字)而不是NA值,这就是现在当我从以下位置使用unite()函数时发生的情况dplyr。有类似的功能可以做到这一点,还是我需要基于与stringr的模式匹配来提取boxID?
dat <- structure(list(boxId = c("CA04", "CA04", "CA01", "CA02", "CA04",
"CA02", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), boxId__1 = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "NM01", "NM14", "NM15",
"NM16", "NM17", "NM18", "NM19", "NM20", "NM02", "NM03", "NM04",
"NM05", "NM06", "NM07", "NM08", "NM09", "NM10", "NM11", "NM12",
"NM13"), boxId__2 = c(NA, NA, NA, NA, NA, NA, "FL01", "FL02",
"FL03", "FL09", "FL08", "FL07", "FL04", "FL05", "FL06", "FL10",
"FL11", "FL13", "FL12", "FL20", "FL19", "FL18", "FL17", "FL16",
"FL14", "FL15", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), boxID = c(NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), boxID__1 = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
boxID__2 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA), boxID__3 = c(NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, "IN05", NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
), boxID__4 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA), boxID__5 = c(NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
boxID__6 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA), boxID__7 = c(NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
boxID__8 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA), boxID__9 = c(NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, "WA11", NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
)), row.names = c(NA, -48L), class = c("tbl_df", "tbl", "data.frame"
))
数据如下:
# A tibble: 48 x 13
boxId boxId__1 boxId__2 boxID boxID__1 boxID__2 boxID__3 boxID__4 boxID__5 boxID__6
<chr> <chr> <chr> <lgl> <lgl> <lgl> <chr> <lgl> <lgl> <lgl>
1 CA04 NA NA NA NA NA NA NA NA NA
2 CA04 NA NA NA NA NA NA NA NA NA
3 CA01 NA NA NA NA NA NA NA NA NA
4 CA02 NA NA NA NA NA NA NA NA NA
5 CA04 NA NA NA NA NA NA NA NA NA
6 CA02 NA NA NA NA NA NA NA NA NA
7 NA NA FL01 NA NA NA NA NA NA NA
8 NA NA FL02 NA NA NA NA NA NA NA
9 NA NA FL03 NA NA NA NA NA NA NA
10 NA NA FL09 NA NA NA NA NA NA NA
# … with 38 more rows, and 3 more variables: boxID__7 <lgl>, boxID__8 <lgl>, boxID__9 <chr>
当我使用unite()时,它看起来像这样:
dat %>%
unite('newID')
我对这些NA值感到困惑:
# A tibble: 48 x 1
newID
<chr>
1 CA04_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA
2 CA04_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA
3 CA01_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA
4 CA02_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA
5 CA04_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA
6 CA02_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA
7 NA_NA_FL01_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA
8 NA_NA_FL02_NA_NA_NA_NA_NA_NA_NA_NA_NA_NA
答案 0 :(得分:1)
使用coalesce
:
dat %>%
mutate_all(as.character) %>%
transmute(newID = coalesce(!!! syms(names(.))))
# # A tibble: 48 x 1
# newID
# <chr>
# 1 CA04
# 2 CA04
# 3 CA01
# 4 CA02
# 5 CA04
# 6 CA02
# 7 FL01
# 8 FL02
# 9 FL03
# 10 FL09
# # … with 38 more rows