r - 如何从 R 中的多列创建合并值的新数据框

我有一个数据框 df1,如下所示:

样本 99_Ape_1 93_Cat_1 87_Ape_2 84_Cat_2 90_Dog_1 92_Dog_2 一个 2 3 1 7 4 6 B 5 9 7 0 3 7 C 6 8 9 2 3 0 D 3 9 0 5 8 3 表>

我想通过对标题行中存在的动物(即“Ape”、“Cat”、“Dog”)的值求和来合并数据框,并最终得到以下数据框:

样本 猿 猫 狗 一个 3 10 10 B 12 9 10 C 15 10 3 D 3 14 11 表>

我创建了一个代表所有动物的列表,称为“animals_list”

然后我创建了一个数据框列表,将每只动物分成一个单独的数据框:

animals_extract <- c()

for (i in 1:length(animals_list)){
  species_extract[[i]] <- df1[, grep(animals_list[i], names(df1))]
}

然后我尝试按样本对行中的每个变量求和:

for (i in 1:length(species_extract)){
  species_extract[[i]]$total <- rowSums(species_extract[[i]])
} 

然后通过绑定(bind)新“总计”列中的所有值来创建数据框“animal_total”。

animal_total <- NULL

for (i in 1:length(species_extract)){
  animal_total[i] <- cbind(species_extract[[i]]$total)
}

不幸的是,这似乎根本不起作用,我想我可能走错了路。非常感谢任何帮助!

编辑:我的数据框有超过 300 只动物,这意味着非常感谢结合使用我的标识符列表 (animals_list)!我还要注意,某些列名称不遵循结构“number_animal_number”,因此我不能使用重复搜索(抱歉!)。

最佳答案

data.table 方法

library(data.table)
library(rlist)
#set data to data.table format
setDT(df1)
# split column 2:n by regex on column names
L <- split.default(df1[,-1], gsub(".*_(.*)_.*", "\\1", names(df1)[-1]))
# Bind together again
data.table(sample = df1$sample, 
           as.data.table(list.cbind(lapply(L, rowSums))))
#    sample Ape Cat Dog
# 1:      A   3  10  10
# 2:      B  12   9  10
# 3:      C  15  10   3
# 4:      D   3  14  11

https://stackoverflow.com/questions/69767937/

相关文章:

python - 如何并排放置两个或多个 ASCII 图像?

rust - 如何使用 Serde 只允许一个字段或另一个字段?

r - flextable 中有条件的粗体值

postgresql - 在 PostgreSQL 中存储 UUID 的最佳数据类型是什么?

c++ - 我将如何在输入的任何文本的长度下加上下划线以及大写每个字母

r - pivot_longer 对于具有相同 names_to 的多个集合

javascript - 如何在 UI5 中对 F5 按键执行自己的操作?

java - 从 Double.toLongBits 创建的 long 中获取 double

google-cloud-platform - 如何继承访问权限以查看属于 GCP 组织的所有项目?

java - dockerBuild 失败导致不支持的类文件主要版本 61 错误