我在tidyr包中有一个与separate()
相关的问题。当数据框中没有NA时,separate()有效。我一直在使用这个功能。但是,今天我有一个案例,其中数据框中有NA。 separate()
返回了一条错误消息。我可能很傻。但是,我想知道tidyr是否可能不适合这种数据清理。或者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
答案 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
选项。
> 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>