首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环通过data.frames

循环通过data.frames
EN

Stack Overflow用户
提问于 2015-10-12 12:40:05
回答 1查看 1.4K关注 0票数 0

我有2 data.frames

代码语言:javascript
复制
> 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

我想应用一个循环来做:

代码语言:javascript
复制
for(i in 1:nrow(cont)){

首先,从cont中获取一些值,这些值将在前面使用

代码语言:javascript
复制
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
}

expressioncol.names == vehicle & perturb中获取这些列并应用除法。

代码语言:javascript
复制
div <- expression$vehicle / expression$perturb #I'm not getting how I can pass here the value in `vehicle` and `perturb`

为这个新变量分配一个列名,它应该是drug_nameconcentration的组合。

代码语言:javascript
复制
col.names(div) <- drug_name_concentration

将其指定为表达式的row.names:

代码语言:javascript
复制
row.names(div) <- row.names(expression)

因此,这个过程将迭代271次(nrow(cont) = 271),每次都会有一个新的简易专栏成为我以前的divcbind。因此,最终结果将是:

代码语言:javascript
复制
                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
.....
.....

逻辑在我的头脑中是清楚的,但我不知道我如何能做到这一点。谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-12 14:11:00

您没有在循环中正确地分配变量。下面是一个示例循环,它将正确地遍历分配变量的每一行。例如,第一个循环i == 1,注意我已经更改了列名的生成方式。

代码语言:javascript
复制
for(i in 1:nrow(cont)){
       vehicle <- cont[i, 3]
       perturb <- cont[i, 4]
       col_name <- paste(cont[i, 5], cont[i, 6], sep = '_')
    }

然后,可以使用以下变量名称搜索各自的列:

代码语言:javascript
复制
df[,which(colnames(df) == x)]

其中df是数据框架,x是变量。

因此,

代码语言:javascript
复制
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

代码语言:javascript
复制
vehicle <- cont[i, 5:9]

代码语言:javascript
复制
vehicle <- cont[i, c(5:9)] ## note c()

更改#2

代码语言:javascript
复制
tmp <- sum(expression[,which(colnames(expression) == vehicle)])/5

代码语言:javascript
复制
tmp <- sum(expression[,which(colnames(expression) %in% vehicle)])/5

最终编辑

全面工作职能:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33081403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档