我有三列Facebook,Twitter和Instagram URL,如下所示:
df <- data.frame(fb_url = c("www.facebook.com/...", "www.facebook.com/...",NA,NA,NA,NA),
tw_url = c(NA, NA, "www.twitter.com/...", "www.twitter.com/...",NA,NA),
ig_url = c(NA, NA, NA, NA, "www.instagram.com/...", "www.instagram.com/..."))
> df
fb_url tw_url ig_url
www.facebook.com/... NA NA
www.facebook.com/... NA NA
NA www.twitter.com/... NA
NA www.twitter.com/... NA
NA NA www.instagram.com/...
NA NA www.instagram.com/...
我只想将它们合并到一列中,如下所示:
url
www.facebook.com/...
www.facebook.com/...
www.twitter.com/...
www.twitter.com/...
www.instagram.com/...
www.instagram.com/...
paste0
和union
给了我错误,我认为我把这个想法复杂化了。
这些列都是factor
的(默认情况下data.frame
调用中stringsAsFactors = TRUE
(,因此可以将其转换为类character
然后使用coalesce
library(dplyr)
df %>%
mutate_all(as.character) %>%
transmute(url = coalesce(!!! .))
# url
#1 www.facebook.com/...
#2 www.facebook.com/...
#3 www.twitter.com/...
#4 www.twitter.com/...
#5 www.instagram.com/...
#6 www.instagram.com/...
您也可以使用基本 R 来执行此操作:
df <- data.frame(fb_url = c("www.facebook.com/...", "www.facebook.com/...",NA,NA,NA,NA),
tw_url = c(NA, NA, "www.twitter.com/...", "www.twitter.com/...",NA,NA),
ig_url = c(NA, NA, NA, NA, "www.instagram.com/...", "www.instagram.com/..."),
stringsAsFactors = FALSE)
data.frame(url = na.omit(unlist(df)),
row.names = NULL)
#> url
#> 1 www.facebook.com/...
#> 2 www.facebook.com/...
#> 3 www.twitter.com/...
#> 4 www.twitter.com/...
#> 5 www.instagram.com/...
#> 6 www.instagram.com/...
您可以使用软件包中的unite
来执行此操作tidyr
:
df[] <- lapply(df, as.character) ## convert data frame to character class
tidyr::unite(df, url, na.rm = T) ## then merge all the columns into url column with removing nas
# url
#1 www.facebook.com/...
#2 www.facebook.com/...
#3 www.twitter.com/...
#4 www.twitter.com/...
#5 www.instagram.com/...
#6 www.instagram.com/...