如何根据其他列的字符值创建第三列,不包括 NA 和值?

How do I create a third column based on Character Values of other columns, excluding NA and values?

如何根据其他列属性的值创建名为 'title' 的新列?

我在下面展示了示例,其中 'title' 需要根据列 Post、Tel、Surname 和 Emp 创建。 'title' 只是表示哪些值不是 NA。 我有这个

   ID1    ID2   Post     Tel          Surname   Emp        
   <chr> <chr> <chr>   <chr>          <chr>   <chr>        
 1 S04   S03   NA      369 990247      NA      NA      
 2 S14   S08   NA      069 990351      NA      NA      
 3 S18   S03   N165HT  NA             Jones    NA      
 4 S19   S13   NA      3069 90685      NA      NA      
 5 S20   S16   NA      3069 90954      NA      NA      
 6 S20   S17   CO19RF  NA              NA      Ocean   

我想创建这个:

   ID1    ID2   Post     Tel          Surname   Emp     title    
   <chr> <chr> <chr>   <chr>          <chr>   <chr>     <chr>    
 1 S04   S03   NA      369 990247      NA      NA       Tel
 2 S14   S08   NA      069 990351      NA      NA       Tel
 3 S18   S03   N165HT  NA             Jones    NA       Post,Surname
 4 S19   S13   NA      3069 90685      NA      NA       Tel
 5 S20   S16   NA      3069 90954      NA      NA       Tel
 6 S20   S17   CO19RF  NA              NA      Ocean    Post,Emp

此处的一个选项是在创建唯一行标识符 ('rn') 后将 gather 转换为 'long' 格式(同时使用 na.rm = TRUE 删除 NA 元素),按 'rn'、paste summarise 中的 'key' 元素分组并与原始数据集绑定

library(tidyverse)
df1 %>%
   rownames_to_column('rn') %>%
   gather(key, val, Post:Emp, na.rm = TRUE) %>%
   group_by(rn) %>%
   summarise(title = toString(key)) %>%
   ungroup %>%
   select(-rn) %>%
   bind_cols(df1, .)
#   ID1 ID2   Post        Tel Surname   Emp         title
#1 S04 S03   <NA> 369 990247    <NA>  <NA>           Tel
#2 S14 S08   <NA> 069 990351    <NA>  <NA>           Tel
#3 S18 S03 N165HT       <NA>   Jones  <NA> Post, Surname
#4 S19 S13   <NA> 3069 90685    <NA>  <NA>           Tel
#5 S20 S16   <NA> 3069 90954    <NA>  <NA>           Tel
#6 S20 S17 CO19RF       <NA>    <NA> Ocean     Post, Emp

数据

df1 <- structure(list(ID1 = c("S04", "S14", "S18", "S19", "S20", "S20"
), ID2 = c("S03", "S08", "S03", "S13", "S16", "S17"), Post = c(NA, 
NA, "N165HT", NA, NA, "CO19RF"), Tel = c("369 990247", "069 990351", 
NA, "3069 90685", "3069 90954", NA), Surname = c(NA, NA, "Jones", 
NA, NA, NA), Emp = c(NA, NA, NA, NA, NA, "Ocean")), row.names = c("1", 
"2", "3", "4", "5", "6"), class = "data.frame")

在基础 R 中:

cols <- c("Post", "Tel", "Surname", "Emp")

d$title <- apply(d[, cols], 1, function(x){
  paste(cols[which(!is.na(x))], collapse = ",")
})