2015-10-12 4 views
0

У меня 2 data.framesпробегаем по 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 
..... 
..... 

Логика понятна в моей голове, но я не получаю, как я могу это сделать. Спасибо за вашу помощь.

ответ

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)] 

подход, где ФР кадр, данные и х является переменной.

Поэтому

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, созданную до цикла с именами строк из выражения таблицы.

Наконец, переименовывает имя столбца, и после завершения цикла он переименовывает имена строк и отбрасывает первый столбец с теперь избыточными значениями.

EDIT - вопрос изменил

изменение # 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 

FINAL EDIT

Полная рабочая функция:

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) 
+0

Благодаря пачкой. Это сработало. Мне было интересно, как это работает: в некоторых случаях имя 'col_name <- paste (cont [i, 5], cont [i, 6], sep = '_')' имеет одно и то же имя для 2 экземпляры и этот код обрабатывали его, указав имена «metformin_0.00001» и «metformin_0.00001.1». Можете ли вы объяснить, почему и как это произошло? – user3253470

+0

Вы можете попробовать создать пустой вектор с 'col_names <- c()', а затем в цикле 'col_names <- c (col_names, paste (cont [i, 5], cont [i, 6], sep = '_ ')) 'очевидно удалить другой экземпляр' col_names' в цикле. а затем после цикла и после 'div <- div [, - 1]' присваивать имена столбцов через 'colnames (div) <- col_names' – amwill04

+0

Хорошо, спасибо. Можете ли вы рассказать мне, каким будет возможное решение ситуации, когда 'perturb' содержит более 1 столбца, и я хочу взять' perturb = сумму столбцов/столбцов' и ​​затем делить 'control/perturb' – user3253470

Смежные вопросы