如何在R中创建具有合并值源的新变量

如何在R中创建具有合并值源的新变量,r,tidyverse,coalesce,R,Tidyverse,Coalesce,我有来自3个不同来源的医学注册数据,对于我的许多变量,我有来自每个注册的多个条目。每行仅包含来自1个注册表(源)的数据。我已经能够将这三个变量合并在一起,形成一个“新”变量,但我还想创建一个变量,说明合并后的变量来自哪个源。 我对以这种方式使用R是新手(通常我会匆忙回到excel来处理变量),我花了一些时间寻找类似的例子,但找不到答案。任何帮助都将不胜感激。(第一次贴海报,所以提出我的问题也很有帮助) 库(tidyverse) df#A tible:5 x 3 #>var1 var2 var3

我有来自3个不同来源的医学注册数据,对于我的许多变量,我有来自每个注册的多个条目。每行仅包含来自1个注册表(源)的数据。我已经能够将这三个变量合并在一起,形成一个“新”变量,但我还想创建一个变量,说明合并后的变量来自哪个源。 我对以这种方式使用R是新手(通常我会匆忙回到excel来处理变量),我花了一些时间寻找类似的例子,但找不到答案。任何帮助都将不胜感激。(第一次贴海报,所以提出我的问题也很有帮助)

库(tidyverse)
df#A tible:5 x 3
#>var1 var2 var3
#>     
#>1纳纳
#>2 NA NA
#>3 NA 3 NA
#>4NA 4NA
#>5 NA NA 5
#将x、y和z合并为“新”变量
>df$新df
#>#一个tibble:5x4
#>var1 var2 var3新
#>       
#>1 NA NA 1
#>2钠钠钠2
#>3钠3钠3
#>4Na4Na4
#>5 NA NA 5
#我还想要一个变量,它给出合并变量的“源”,即
将如下所示,但我不知道如何执行此操作
>决赛
#>#一个tibble:5x5
#>var1 var2 var3新源
#>        
#>1 NA NA 1 var1
#>2 NA NA 2 var1
#>3Na3Na3Var2
#>4Na4Na4Var2
#>5 NA NA 5 var3
一个选项:

df$source <- 
  do.call(
    coalesce,
    lapply(seq_len(ncol(df)), function(i) ifelse(is.na(df[[i]]), NA, names(df)[[i]]))    
  )
# [1] "var1" "var1" "var2" "var2" "var3"
第三种纯碱R溶液:

names(df)[apply(df, 1, function(x) match(FALSE, is.na(x)))]
# [1] "var1" "var1" "var2" "var2" "var3"
一种选择:

df$source <- 
  do.call(
    coalesce,
    lapply(seq_len(ncol(df)), function(i) ifelse(is.na(df[[i]]), NA, names(df)[[i]]))    
  )
# [1] "var1" "var1" "var2" "var2" "var3"
第三种纯碱R溶液:

names(df)[apply(df, 1, function(x) match(FALSE, is.na(x)))]
# [1] "var1" "var1" "var2" "var2" "var3"

按行使用

tibble(var1 = c(1,2,NA,NA,NA), var2 = c(NA,NA,3,4,NA),var3 = c(NA,NA,NA,NA,5)) %>%
  rowwise() %>%
  mutate(source = names(.)[which(!is.na(c_across(var1:var3)))])

   var1  var2  var3 source
  <dbl> <dbl> <dbl> <chr> 
1     1    NA    NA var1  
2     2    NA    NA var1  
3    NA     3    NA var2  
4    NA     4    NA var2  
5    NA    NA     5 var3
tibble(var1=c(1,2,NA,NA,NA),var2=c(NA,NA,3,4,NA),var3=c(NA,NA,NA,NA,NA,5))%%
行()
mutate(source=names(.)[其中(!是.na(c_-overs(var1:var3)))]))
var1 var2 var3源
1娜娜瓦拉1
2娜娜瓦拉1
3 NA 3 NA var2
4 NA 4 NA var2
5 NA NA 5 var3

按行使用

tibble(var1 = c(1,2,NA,NA,NA), var2 = c(NA,NA,3,4,NA),var3 = c(NA,NA,NA,NA,5)) %>%
  rowwise() %>%
  mutate(source = names(.)[which(!is.na(c_across(var1:var3)))])

   var1  var2  var3 source
  <dbl> <dbl> <dbl> <chr> 
1     1    NA    NA var1  
2     2    NA    NA var1  
3    NA     3    NA var2  
4    NA     4    NA var2  
5    NA    NA     5 var3
tibble(var1=c(1,2,NA,NA,NA),var2=c(NA,NA,3,4,NA),var3=c(NA,NA,NA,NA,NA,5))%%
行()
mutate(source=names(.)[其中(!是.na(c_-overs(var1:var3)))]))
var1 var2 var3源
1娜娜瓦拉1
2娜娜瓦拉1
3 NA 3 NA var2
4 NA 4 NA var2
5 NA NA 5 var3