簡體   English   中英

在 r 中粘貼具有條件的列元素

[英]paste column elements with condition in r

我有一個數據框,我想在name1name2name3粘貼不包含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包來使用rowwisec_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

或者使用帶有pastereplace 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"    

我們可以使用unitetidyr使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM