R-无NA值的联合
我有多个专栏。所有列在某些行中都有NA值。是否可以在新列中不包含NA值的情况下合并这些列 没有NA值:R-无NA值的联合,r,dataframe,dplyr,R,Dataframe,Dplyr,我有多个专栏。所有列在某些行中都有NA值。是否可以在新列中不包含NA值的情况下合并这些列 没有NA值: library(dplyr) unite(mtcars, 'mpg_am', c('mpg','am')) 创建假数据: mtcars$NA_1 = ifelse(mtcars$mpg>20, NA, mtcars$mpg) mtcars$NA_2 = ifelse(mtcars$cyl>6, NA, mtcars$mpg) unite(mtcars, 'Var1', c('NA
library(dplyr)
unite(mtcars, 'mpg_am', c('mpg','am'))
创建假数据:
mtcars$NA_1 = ifelse(mtcars$mpg>20, NA, mtcars$mpg)
mtcars$NA_2 = ifelse(mtcars$cyl>6, NA, mtcars$mpg)
unite(mtcars, 'Var1', c('NA_1','NA_2'))
这将创建如下值:
Var1
NA_21
15.5_NA
NA_NA
15.5_21
...
期望输出:
Var1
21
15.5
NA
15.5_21
...
我们可以使用
unite
和na.rm
library(tidyverse)
mtcars %>%
rownames_to_column('rn') %>%
mutate_at(vars(starts_with("NA")), as.character) %>%
unite(Var1, NA_1, NA_2, na.rm = TRUE) %>%
mutate(Var1 = na_if(Var1, "")) %>%
column_to_rownames('rn')
或者另一个选项是
联合
而不是联合
mtcars %>%
mutate(Var1 = str_c(coalesce(NA_1, NA_2), coalesce(NA_2, NA_1), sep="_"))
或者另一种选择是
mtcars %>%
mutate_at(vars(starts_with("NA")), list(~ replace_na(., ''))) %>%
mutate(Var1 = str_remove(na_if(str_c(NA_1, NA_2, sep="_"), '_'), '^_|_$') ) %>%
select(-NA_1, NA_2)
unite
已获得na.rm
参数,该参数将删除na
值,但该列需要为字符类型
library(dplyr)
library(tidyr)
mtcars %>%
mutate_at(vars(NA_1, NA_2), as.character) %>%
unite(Var1, NA_1, NA_2, na.rm = TRUE)
# mpg cyl disp hp drat wt qsec vs am gear carb Var1
#1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 21
#2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 21
#3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 22.8
#4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 21.4
#5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
#6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 18.1_18.1
#.....
但是,如果两个值都是NA
,那么这将返回空值,而不是NA
,如果我们需要NA
,我们可以严格检查空值并replace
mtcars %>%
mutate_at(vars(NA_1, NA_2), as.character) %>%
unite(Var1, NA_1, NA_2, na.rm = TRUE)
mutate(Var1 = replace(Var1, Var1 == "", NA_character_))
如果没有任何包,我们可以在base R中使用
paste0
cols <- c('NA_1','NA_2')
mtcars["V1"] <- apply(mtcars[cols],1,function(x) paste0(na.omit(x), collapse = "-"))
cols这只适用于Tidyr的开发版本。na.rm参数尚未在Tidyr的CRAN版本中实现。但这仅适用于Tidyr的开发版本。na.rm参数尚未在Tidyr的CRAN版本中实现。对于其他stackoverflow用户来说,这更像是一个提示,他们想知道为什么解决方案不能与Tidyr的CRAN版本一起使用。感谢您提供了不使用tidyr开发版本的可能性。