如何将数据框的 3 列聚合/组合成一列,其中 R 中其他三列的值的总和?

数据挖掘 r 统计数据
2022-01-24 11:00:54

在此处输入图像描述

这张图片显示了我的数据集的一部分,我想将这些列合并GR_S01_w1_aGR_S01_w1_b一个GR_S01_w1_cGR_S01_w1中 - 其值是三者的总和。

我知道如何使用 mutate 添加一个执行此操作的新列,但我也想删除其他三个,并为我拥有的所有其他样本再执行大约 100 次。所以本质上 - 我以格式列的形式对每个样本进行了三个重复samplename_asamplename_b并且samplename_c我想用一个列替换它们,多次重复。

我试过像这样使用 mutate -

Gregory <- Gregory %>% mutate(GR_S01_w1 = sum(GR_S01_w1_a, GR_S01_w1_b, GR_S01_w1_c))

但是对于我拥有的所有样本,这当然会花费太长时间。我有没有一种快速的方法来做到这一点(除了手动在 excel 上,这是我目前正在做的)?

2个回答

回答

这可以通过以下几个步骤来完成:

  1. 用于grep获取要汇总的列组
  2. rowSums在每组列上使用
base <- c("GR_S01_w1", "GR_S01_w2")
cols <- lapply(base, grep, names(Gregory), fixed = TRUE)
for (i in seq_along(base)) {
  Gregory[, base[i]] <- rowSums(Gregory[, cols[[i]]])
}

这使整个过程自动化,无需手动定义任何名称(组名称除外),也无需将数据集转换为长数据集然后再转换为宽数据集。


自动查找样本名称

如果您也不想手动指定样本,那么您可以使用grepand sub在这里,我们假设您的结构始终是“示例下划线字母”,例如sample_dor test_sample_b我们可以通过使用来做到这一点grep

relevant_columns <- grep(".*_[a-zA-Z]{1}$", names(Gregory), value = TRUE)
base <- unique(sub("(_[a-zA-Z]{1})$", "", relevant_columns))
base
# [1] "GR_S01_w1" "GR_S01_w2"

grep术语的含义:

  • .*: 任意数量的任意字符。
  • _: 存在下划线,后跟...
  • [a-zA-Z]:任何字母(小写或大写)。
  • {1}: 只有其中之一。
  • $: 到此结束。

接下来,我们只需使用sub删除该部分,选择unique值,我们就完成了。

这确实假设:

  1. 没有其他以_[a-zA-Z];结尾的列 您可以通过输入names(Gregory)[-1]或您不想考虑的任何列来避免这些列。
  2. 名称后仅跟一个字母,而不是例如两个或三个。

在 base R 中,你可以很容易地做到这一点:

# creates new variable as sum of the 3 existing ones
data$GR_S01_w1 <- data$GR_S01_w1_a + data$GR_S01_w1_b + data$GR_S01_w1_c

# remove the 3 existing ones
data$GR_S01_w1_a <- data$GR_S01_w1_b <- data$GR_S01_w1_c <- NULL