首页 > 解决方案 > 如何将两行中的信息与几乎相同的名称组合起来

问题描述

我的数据框包含许多名称几乎相同的列,例如 A 和 A...1 、 B 和 B...1 等等。我想将这些列合并,例如 A 和 A...1 成为一列。所有这些列都包含 0,1 或 NA,NA:s 应被视为零 (0)。因此,如果 A 列是 0,0,1,1,NA 并且 A...1 列是 1,0,0,0,1,combined_A 应该 = 1,0,1,1,1。因此,如果这些列元素中的任何一个在其他列中为 1,则它们应该在组合列中为 1。

这是一些生成示例的代码

original_table <- data.frame(A = c(0,0,1,1,NA),B = c(1,1,NA,NA,1),A...1 = c(1,0,0,0,1),B...1 = c(0,1,0,1,1))  

所以原来的表是这样的

A  B  A...1  B...1
0  1  1      0
0  1  0      1
1  NA 0      0
1  NA 0      1
NA 1  1      1

合并后所需的输出表将如下所示。

combined_table <- data.frame(combined_A = c(1,0,1,1,1),combined_B = c(1,1,0,1,1))  
combined_A combined_B
1          1
0          1
1          0
1          1
1          1

我对 R 相当熟悉,但我找不到任何关于这个问题的帮助。

标签: r

解决方案


我们可以使用split.default基于列名中的公共部分进行拆分。在这个例子中,我们似乎可以通过提取每个列名的第一个字母来找到常见的列。

substr(names(original_table), 1, 1)
#[1] "A" "B" "A" "B"

我们使用它来拆分列,并在每个组中使用pmax来获取每行删除的最大值NA

as.data.frame(lapply(split.default(original_table, 
        substr(names(original_table), 1, 1)), function(x) 
        do.call(pmax, c(x, na.rm = TRUE))))

#  A B
#1 1 1
#2 0 1
#3 1 0
#4 1 1
#5 1 1

推荐阅读