将具有公共引用名称的所有列合并为 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))]
希望对您有所帮助!
我有一个列数据框,所有字符,我想加入一列,用 _ 或 - 分隔,不加入 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))]
希望对您有所帮助!