我有2个data.frames
> head(cont)
old_pert cmap_name conc perturb_geo t1 t2 t3 t4 t5
1 5202764005789148112904.A02 estradiol 0.00000001 GSM119257 GSM119218 GSM119219 GSM119221 GSM119222 GSM119223
2 5202764005789148112904.A01 valproic acid 0.00050000 GSM119256 GSM119218 GSM119219 GSM119221 GSM119222 GSM119223
> head(expression)[1:3,1:8]
GSM118911 GSM118912 GSM118913 GSM118723 GSM118724 GSM118725 GSM118726 GSM118727
1007_s_at 387.6 393.2 290.5 378.6 507.8 383.7 288.8 451.9
1053_at 56.4 53.5 32.8 39.0 71.5 47.3 46.0 50.1
117_at 6.3 33.6 19.2 17.6 20.3 15.0 7.1 43.1
我想应用循环来执行:
for(i in 1:nrow(cont)){
首先从cont
获取一些将提前使用的值
vehicle <- cont[i, 5:9]
perturb <- cont[i, 4]
col_name <- paste(cont[i, 2], cont[i, 3], sep = '_') #estradiol_.00001
tmp <- sum(expression[,which(colnames(expression) == vehicle)])/5
tmp2 <- expression[,which(colnames(expression) == perturb)]
tmp3 <- tmp/tmp2
div <- cbind(div, tmp3)
colnames(div)[i + 1] <- col_name
}
从expression
col.names == vehicle & perturb
获取这些列并应用除法。
div <- expression$vehicle / expression$perturb #I'm not getting how I can pass here the value in `vehicle` and `perturb`
为此新变量指定一个列名,该列名应为drug_name
和concentration
的组合
col.names(div) <- drug_name_concentration
为其指定表达式的row.names:
row.names(div) <- row.names(expression)
因此,此过程将迭代271次(nrow(cont) = 271
)并且每次新的分段列cbind
到我之前的div
。因此,最终结果将是:
arachidonic acid_0.000010 oligomycin_0.000001 .........
1007_s_at 0.45 0.30
1053_at 1.34 0.65
117_at 0.11 0.67
.....
.....
我脑子里的逻辑清晰但我无法理解。谢谢你的帮助。
答案 0 :(得分:1)
您没有在循环中正确分配变量。下面是一个示例循环,它将正确地遍历分配变量的每一行。例如第一个循环i == 1,注意我已经改变了列名的生成方式。
for(i in 1:nrow(cont)){
vehicle <- cont[i, 3]
perturb <- cont[i, 4]
col_name <- paste(cont[i, 5], cont[i, 6], sep = '_')
}
然后使用这些变量名称搜索相应的列,然后可以使用:
df[,which(colnames(df) == x)]
方法,其中df是数据框,x是变量。
因此,
div <- data.frame(row.names(expression))
for(i in 1:nrow(cont)){
vehicle <- cont[i, 3]
perturb <- cont[i, 4]
col_name <- paste(cont[i, 5], cont[i, 6], sep = '_')
tmp <- expression[,which(colnames(expression) == vehicle)]/
expression[,which(colnames(expression) == perturb)]
div <- cbind(div, tmp)
colnames(div)[i + 1] <- col_name
}
div <- div[,-1]
row.names(div) <- row.names(expression)
正在发生的事情是它遍历每一行,在找到这些列之前将值赋给变量,然后简单地除以结果向量。
然后按列绑定到循环之前创建的div数据框,其中包含表表达式中的行名称。
最后,重命名列名称,然后在完成循环之后重新命名行名称并删除第一列中的现有冗余值。
编辑 - 问题已更改
更改#1
vehicle <- cont[i, 5:9]
到
vehicle <- cont[i, c(5:9)] ## note c()
改变#2
tmp <- sum(expression[,which(colnames(expression) == vehicle)])/5
到
tmp <- sum(expression[,which(colnames(expression) %in% vehicle)])/5
最终编辑
完整的工作职能:
for(i in 1:nrow(cont)){
perturb <- cont[i, 4]
col_name <- paste(cont[i, 2], cont[i, 3], sep = '_')
vehicle <- cont[i, c(5:9)]
vehicle <- unname(unlist(vehicle[1,]))
tmp <- expression[,which(colnames(expression) %in% vehicle)]
row_tots <- as.data.frame(rowSums(tmp))
row_tots <- row_tots/5
tmp <- row_tots/expression[,which(colnames(expression) == perturb)]
div <- cbind(div, tmp)
colnames(div)[i + 1] <- col_name
}
div <- div[,-1]
row.names(div) <- row.names(expression)