【问题标题】:sum columns based on substring in data frame根据数据框中的子字符串对列求和
【发布时间】:2017-11-20 11:59:12
【问题描述】:

我有一个 384 列的 data.frame。我想根据字母 A-H 后跟两个数字的子字符串对具有相似列名的列求和。
我试图存储一个模式然后循环,但无法定义唯一的子字符串。

patterns <- unique(substr(names(DT)))  
new <- sapply(patterns, function(xx) rowSums(DT[,grep(xx, names(DT)), drop=FALSE]))  

我的 colnames 看起来像这样:

   > head(colnames(DT))
[1] "01_001_A01_S1_L001_R1_001" "01_001_A01_S1_L005_R1_001" "01_002_A02_S2_L001_R1_001" "01_002_A02_S2_L005_R1_001"
[5] "01_002_A03_S3_L001_R1_001" "01_002_A03_S3_L005_R1_001"

求和列 A01 和 A01、A02 和 A02 等...

【问题讨论】:

  • lapply(split.default(df1, names(df1)), rowSums) ?
  • 我认为这行不通。 split.default 在这里做什么?
  • 在不知道列名中的模式(例如该子字符串出现的位置)的情况下,不清楚如何提取它,即。它可能是zA01ZA01ddf 等。您的代码unique(substr(names(DT)))substr 没有任何开始或结束参数。

标签: r


【解决方案1】:

我们可以substring 数据集的names 并将其用于split 数据集并获取rowSums

lapply(split.default(df1, substr(names(df1), 8, 10)), rowSums, na.rm = TRUE)

假设列名的字符数是固定的

如果不是固定字符数,'A01'等位置发生变化,则使用sub

lapply(split.default(df1, sub("^[^A-Z]*([A-Z][0-9]{2}).*", "\\1",  
                           names(df1))), rowSums, na.rm = TRUE)

【讨论】:

  • 但是列不是以A01开头的,是在名字的中间。
  • 用真实的列名更新了我的 Q
猜你喜欢
  • 2021-10-07
  • 1970-01-01
  • 2020-06-01
  • 2021-12-13
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多