R中数据帧的两列标题的相等性测试

时间:2014-04-13 22:46:03

标签: r dataframe

我希望通过名称在数据框中找到重复的样本,然后计算它们的平均值。但首先,样本名称的相等测试也不起作用(或者'连接',我不确定,因为使用print()和write.table进行调试没有帮助。)。我做错了什么?

我的数据表有20531行和1155列,我想得到每行重复列的平均值。

我的相等测试代码(第一列标题是'基因ID',所以我跳过了dfs [,1],在相等测试之后,我尝试将目标列连接到一个数据框):

dfs <- as.data.frame(dfs)
for(i in 2:ncol(dfs)) {
  oneOftheSamples <- data.frame(dfs[,i])
  colnames(oneOftheSamples) <- colnames(dfs)[i]
  head(oneOftheSamples)
  wantedcolname <- colnames(oneOftheSamples)
  n <- i
  for (j in n:ncol(dfs)){
    foundcolname <- colnames(dfs)[j]
    if((wantedcolname==foundcolname) & (j!=i)){
      repOftheSample <- data.frame(dfs[,j])
      colnames(repOftheSample) <- colnames(dfs)[j]
      oneOftheSamples <- data.frame(oneOftheSamples,repOftheSample)
    }
  }
}

任何提示或评论都可能有用,提前谢谢!

1 个答案:

答案 0 :(得分:0)

下一次提示将分享您的数据。我无法弄清楚你的循环应该做什么,但根据你的帖子,这就是你如何得到重复列的平均值

set.seed(1618)
dat <- matrix(rpois(100, 1), ncol = 10)
colnames(dat) <- sample(LETTERS[1:5], 10, replace = TRUE)
dat <- as.data.frame(dat, check.names = FALSE)

#    A B D E A B B C E B
# 1  0 2 0 2 3 1 0 0 3 0
# 2  1 1 0 1 0 1 0 0 2 1
# 3  0 0 2 0 0 1 4 1 3 0
# 4  1 0 0 0 0 2 0 2 0 1
# 5  0 1 0 1 0 2 0 2 0 1
# 6  1 0 2 1 1 1 1 0 1 0
# 7  1 1 1 0 1 1 1 1 0 0
# 8  0 1 1 1 1 0 1 1 0 0
# 9  0 1 1 1 1 2 0 1 0 0
# 10 0 1 0 2 1 0 0 2 0 1

有些列重复了两次以上,所以我只想要唯一的列

(dups <- unique(names(dat)[duplicated(names(dat))]))
# [1] "A" "B" "E"
dat.list <- lapply(dups, function(x) dat[names(dat) %in% x])
# list of three

我猜你想要每个

的行方式
dat1 <- sapply(1:length(dat.list), function(x) 
  apply(dat.list[[x]], 1, mean))
colnames(dat1) <- dups

as.data.frame(dat1)
#      A    B   E
# 1  1.5 0.75 2.5
# 2  0.5 0.75 1.5
# 3  0.0 1.25 1.5
# 4  0.5 0.75 0.0
# 5  0.0 1.00 0.5
# 6  1.0 0.50 1.0
# 7  1.0 0.75 0.0
# 8  0.5 0.50 0.5
# 9  0.5 0.75 0.5
# 10 0.5 0.50 1.0