我希望通过名称在数据框中找到重复的样本,然后计算它们的平均值。但首先,样本名称的相等测试也不起作用(或者'连接',我不确定,因为使用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)
}
}
}
任何提示或评论都可能有用,提前谢谢!
答案 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