当NA中的粘贴列中存在NA时,将粘贴的列值设为NA

时间:2018-01-24 23:46:02

标签: r dataframe

我的数据类似于以下内容:

Clone+static

我试图将列粘贴在一起并获得NA,如果给定观察的任何粘贴列中存在任何NA,例如:

a<-data.frame(pig=c(NA,"a","b","c",NA),cow=c(NA,"101","112","77",NA),chicken=c("Sep",NA,"Oct","Nov",NA),stringsAsFactors=FALSE)
print(a)
pig  cow chicken
<NA> <NA>   Sep
 a  101    <NA>
 b  112     Oct
 c   77     Nov
<NA> <NA>  <NA>

我使用了以下

pig  cow chicken   rooster
<NA> <NA>   Sep     <NA>
 a   101    <NA>    <NA>
 b   112    Oct   b-112-Oct
 c   77     Nov   c-77-Nov
<NA> <NA>   <NA>    <NA>

这会产生包含NA作为字符串一部分的字符串,这并不理想。我见过的文档没有明确解决这个问题,例如:suppress NAs in paste()有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:2)

stringr::str_c有&#34;传染性&#34; NAŠ

paste('a', 'b', NA)
#> [1] "a b NA"

stringr::str_c('a', 'b', NA)
#> [1] NA

答案 1 :(得分:1)

如果我们使用ifelse套餐,您可以使用case_whentidyverse方法。

library(dplyr)

a <- data.frame(
  pig = c(NA, "a", "b", "c", NA),
  cow = c(NA, "101", "112", "77", NA),
  chicken = c("Sep", NA, "Oct", "Nov", NA),
  stringsAsFactors = FALSE
)

a %>%
  mutate(
    rooster = case_when(
      is.na(pig) | is.na(cow) | is.na(chicken) ~ NA_character_,
      TRUE ~ paste(pig, cow, chicken, sep = "-")
    )
  )

#    pig  cow chicken   rooster
# 1 <NA> <NA>     Sep      <NA>
# 2    a  101    <NA>      <NA>
# 3    b  112     Oct b-112-Oct
# 4    c   77     Nov  c-77-Nov
# 5 <NA> <NA>    <NA>      <NA>