r - 在 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()
andselect()
选择两种方法后都不包含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(.))))))
有什么办法可以得到我想要的吗?任何帮助将不胜感激!
解决方案
我们可以rowwise
通过c_across
只加载dplyr
包来使用
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
或base R
与paste
和一起使用replace
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"