Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-无NA值的联合_R_Dataframe_Dplyr - Fatal编程技术网

R-无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

我有多个专栏。所有列在某些行中都有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_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开发版本的可能性。