在tidyr与NA分开()

时间:2014-08-19 02:47:23

标签: r tidyr

我在包中有一个与separate()相关的问题。当数据框中没有NA时,separate()有效。我一直在使用这个功能。但是,今天我有一个案例,其中数据框中有NA。 separate()返回了一条错误消息。我可能很傻。但是,我想知道是否可能不适合这种数据清理。或者separate()有什么办法可以与NA合作?非常感谢您抽出宝贵的时间。

以下是基于评论的更新示例。假设我想在y中分隔字符并创建新列。如果我删除带有NA的行,separate()将起作用。但是,我不想删除该行,我该怎么办?

x <- c("a-1","b-2","c-3")
y <- c("d-4","e-5", NA)
z <- c("f-6", "g-7", "h-8")

foo <- data.frame(x,y,z, stringsAsFactors = F)

ana <- foo %>%
   separate(y, c("part1", "part2"))

# > foo
#    x    y   z
# 1 a-1  d-4 f-6
# 2 b-2  e-5 g-7
# 3 c-3 <NA> h-8
# > ana <- foo %>%
# +        separate(y, c("part1", "part2"))
# Error: Values not split into 2 pieces at 3

2 个答案:

答案 0 :(得分:3)

一种方法是:

    res <- foo %>% 
    mutate(y=ifelse(is.na(y), paste0(NA,"-", NA), y)) %>% 
    separate(y, c('part1', 'part2'))
     res[res=='NA'] <- NA
    res
    #   x part1 part2   z
   #1 a-1     d     4 f-6
   #2 b-2     e     5 g-7
   #3 c-3  <NA>  <NA> h-8

答案 1 :(得分:3)

您可以在extra中使用separate选项。

以下是hadley's github issue page

的示例
> df <- data.frame(x = c("a", "a b", "a b c", NA))
> df
      x
1     a
2   a b
3 a b c
4  <NA>
> df %>% separate(x, c("a", "b"), extra = "merge")
     a    b
1    a <NA>
2    a    b
3    a  b c
4 <NA> <NA>
> df %>% separate(x, c("a", "b"), extra = "drop")
     a    b
1    a <NA>
2    a    b
3    a    b
4 <NA> <NA>