首页 > 解决方案 > 如何消除由一组多数列引起的过度表示?

问题描述

我目前正在与两组一起研究一组遗传数据。P[任意数], P[任意数].PE

这些组是处于不同阶段的患者(P = 初始,PE = 超过 24 周)现在我的 P 组比 PE 组更大。在同一数据帧中大约有 96 个 P 样本,65 个 PE

我已经创建了一个函数来绘制具有两个阶段的 PCA,但是这种由 P 组引起的过度表示移动了所有 PCA。

出于这个原因,我想做的是删除那些不重复的。我的意思是,我只想要一个包含两个样本的数据框。例如:P2和PE_2,P3和PE_3,去掉有P[AnyNumber]但没有PE的

示例数据框:

  data <- data.frame(matrix(rbinom(10*1000, 1, .5), ncol=10))
  colnames(data) <- c("P1","P1.PE","P10","P100","P101","P101.PE", "P102", "P102.PE","P103","P104")

我期望它是一个带有列的数据框:

P1 | P1.PE | P101 | P101.PE | P102 | P102.PE |

我尝试做的是首先使用 grepl 和 strsplit 过滤数据帧,但我得到了错误,可能有一种更简单的方法可以做到这一点。

data.filter <- data[,c(unlist(data.frame(strsplit(colnames(data[,grepl("\\.",colnames(data))]),"\\."),stringsAsFactors = F)[1,]),colnames(data[,grepl("\\.",colnames(data))]))]

先感谢您。

标签: r

解决方案


也许我们可以删除从.列名开始的子字符串,应用duplicated获取所有重复的列名。

v1 <- sub("\\..*", "", names(data))
newdata <- data[duplicated(v1)|duplicated(v1, fromLast = TRUE)]
names(newdata)
#[1] "P1"      "P1.PE"   "P101"    "P101.PE" "P102"    "P102.PE"

推荐阅读