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

时间:2018-01-31 08:21:44

标签: r dataframe merge cbind

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

这样做的原因,如果你感到好奇的是,粘贴在一起的OptionCode会为另一个数据框创建一个唯一的代码,这个数据框具有相同的顺序,然后我将进入该框架。

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

可重复的例子:

示例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)

谢谢!

1 个答案:

答案 0 :(得分: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)

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))]

希望这有帮助!