是否有R函数从具有许多NA值的逗号分隔字符串中仅提取数字,以创建仅包含数字的列?

car*_*rol 6 string r numeric na

我有一个看起来像这样的数据集:

 before = data.frame(diag1 = c(1,NA, 1, NA, NA, 1), diag2 = c(NA, NA, NA, 2, NA, NA), diag3 = c(3, NA, NA, NA, 3, 3), diag4 = c(4, 4, NA, NA, 4, NA))

  diag1 diag2 diag3 diag4
1     1    NA     3     4
2    NA    NA    NA     4
3     1    NA    NA    NA
4    NA     2    NA    NA
5    NA    NA     3     4
6     1    NA     3    NA
Run Code Online (Sandbox Code Playgroud)

我一直在尝试寻找一种解决方案,其中最终结果是一个新列,名为“ diagnoses”,看起来像这样

  diagnoses
1     1,3,4
2         4
3         1
4         2
5       3,4
6       1,3
Run Code Online (Sandbox Code Playgroud)

这只是我实际问题的一个小得多的例子。在我正在研究的数据集中,有70多个诊断列,每行不超过3个数值。我尝试过strsplit,单独的,统一的功能。我仍然没有找到一个优雅的解决方案

我已经使用了粘贴功能

dat$diagnoses<- apply( (dat[ , cols]), 1, function(x) paste(na.omit(x),collapse=", ") )
Run Code Online (Sandbox Code Playgroud)

但是,它会产生带有许多逗号的字符串。

我尝试用gsub代替,但仍然无法获得希望的结果。

这是我已经得到的输出: "1,,3,4,," ",,,4,," " 1,,,,," ",2,,,," ",,3,4,," "1,,3,,,"

akr*_*run 4

一个选项是使用 循环遍历行apply,将NA元素和paste它一起删除

before$new <- apply(before, 1, function(x) toString(x[!is.na(x)]))
before$new
#[1] "1, 3, 4" "4"       "1"       "2"       "3, 4"    "1, 3"   
Run Code Online (Sandbox Code Playgroud)