将具有公共引用名称的所有列合并为 R 中的一列(可重现代码)

Combine all columns with a common reference name into one column in R (reproducible code)

我有一个列数据框,所有字符,我想加入一列,用 _ 或 - 分隔,不加入 NA。现在这通常很容易,但问题是 我不知道数据框中会有多少列。 背后的原因是这个数据框是在重复组中创建的其中列数是一个变量。幸运的是,所有列都具有相同的前面名称并进行了编号,即如下所示的 OptionCode1、OptionCode2 等。

如果您好奇的话,这样做的原因是 OptionCode 粘贴在一起为另一个数据框创建了一个唯一代码,该数据框具有与我将 cbind 到的顺序相同的顺序。

我可能可以在 foreach 循环中用 paste for ncol(df) 很容易地做到这一点,但我想了解是否有更简洁的方法来做到这一点。在像 RI 这样的矢量语言中,我假设有,但我不知道如何,也无法在任何地方找到它。

可重现的例子:

示例 1:

假设我有这样的数据:

OptionCode1 <- c("aa", "bb", "cc", "dd")
OptionCode2 <- c("bb", NA, "dd", NA)
df1 <- data.frame(OptionCode1, OptionCode2)

我想要这样的数据:

OptionCodeMerge <- c("aa-bb","bb","cc-dd","dd")
df1.desired <- data.frame(OptionCodeMerge)

示例 2:

假设有四列:

OptionCode1 <- c("aa", "bb", "cc", "dd")
OptionCode2 <- c("bb", NA, "dd", NA)
OptionCode3 <- c("cc", "dd", NA, NA)
OptionCode4 <- c("dd", NA, "dd", NA)
df2 <- data.frame(OptionCode1, OptionCode2, OptionCode3, OptionCode4)

我想要这样的数据:

OptionCodeMerge2 <- c("aa-bb-cc-dd","bb-dd","cc-dd-dd","dd")
df2.desired <- data.frame(OptionCodeMerge2)

谢谢!

这是一个可能的解决方案:

OptionCode1 <- c("aa", "bb", "cc", "dd")
OptionCode2 <- c("bb", NA, "dd", NA)
OptionCode3 <- c("cc", "dd", NA, NA)
OptionCode4 <- c("dd", NA, "dd", NA)
df2 <- data.frame(OptionCode1, OptionCode2, OptionCode3, OptionCode4)

data.frame(x=apply(df2,1,function(x) {paste(x[!is.na(x)],collapse='-')}))

输出:

            x
1 aa-bb-cc-dd
2       bb-dd
3    cc-dd-dd
4          dd

如果 data.frame 中还有其他列,您可以将 df2 替换为

df2[,grepl('OptionCode',colnames(df2))]

希望对您有所帮助!