我在tidyr包中有一个与separate()相关的问题。当数据帧中没有NA时,separate()起作用。我经常使用这个函数。但是,今天我遇到了一个在数据帧中有NAs的情况。separate()返回错误消息。我可能会很傻。但是,我想知道tidyr是否不是为这种数据清理而设计的。或者,有没有什么方法可以让separate()与NAs协同工作?非常感谢您能抽出时间来。
这是一个基于评论的更新示例。假设我想分隔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发布于 2014-08-19 12:31:11
一种方法是:
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发布于 2015-07-18 00:02:55
您可以在separate中使用extra选项。
这里有一个来自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>https://stackoverflow.com/questions/25374969
复制相似问题