[英]paste column elements with condition in r
我有一個數據框,我想在name1
、 name2
和name3
粘貼不包含NA
元素。
c <- data.frame(name1 = letters[1:3],
name2 = c('A', NA, 'C'),
name3 = c('pig', 'cow', NA)
)
結果應該是這樣的:
c %>% mutate(new_name = c('a&A&pig', 'b&cow', 'c&C'))
當我使用paste0()
它會綁定所有元素,包括NA
。 我不想要這個。
c %>% mutate(new_name = paste0(name1,'&', name2, '&', name3))
然后我又嘗試了另外兩種方法。 一種是使用group_split()
將數據幀拆分為列表,另一種是通過index
嵌套數據幀。 然后使用map()
和select()
選擇兩種方法后不包含NA
但都失敗的列。
c %>%
mutate(index = row_number()) %>%
group_split(index) %>%
map(select(~where(~!any(is.na(.)))))
c %>%
mutate(index = row_number()) %>%
nest(data = name1:name3) %>%
mutate(without_NA_data = map(data, select(~where(~!any(is.na(.))))))
有什么辦法可以得到我想要的嗎? 任何幫助將不勝感激!
我們可以通過只加載dplyr
包來使用rowwise
和c_across
library(dplyr)
c %>%
rowwise %>%
mutate(new_name = paste(na.omit(c_across(everything())), collapse="&")) %>%
ungroup
# A tibble: 3 x 4
# name1 name2 name3 new_name
# <chr> <chr> <chr> <chr>
#1 a A pig a&A&pig
#2 b <NA> cow b&cow
#3 c C <NA> c&C
或者用pmap
library(purrr)
c %>%
mutate(new_name = pmap_chr(., ~ paste(na.omit(c(...)), collapse="&")))
# name1 name2 name3 new_name
#1 a A pig a&A&pig
#2 b <NA> cow b&cow
#3 c C <NA> c&C
或者使用帶有paste
和replace
base R
trimws(do.call(paste, c(replace(c, is.na(c), ''), sep="&")), whitespace = "&")
#[1] "a&A&pig" "b&&cow" "c&C"
或使用apply
apply(c, 1, function(x) paste(na.omit(x), collapse="&"))
#[1] "a&A&pig" "b&cow" "c&C"
或先paste
並刪除NA
子字符串
gsub("&NA|NA&|NA$", "", do.call(paste, c(c, sep="&")))
#[1] "a&A&pig" "b&cow" "c&C"
我們可以使用unite
的tidyr
使用na.rm = TRUE
刪除NA
值
tidyr::unite(c, new_name, starts_with('name'),
sep = '&', na.rm = TRUE, remove = FALSE)
# new_name name1 name2 name3
#1 a&A&pig a A pig
#2 b&cow b <NA> cow
#3 c&C c C <NA>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.