2014-11-26 1 views
2

У меня есть data.frame, содержащий Время как первый столбец, то каждый последующий столбец представляет собой концентрацию фактора транскрипции для отдельных ячеек, например:В R извлекайте значение столбца 1, где последующие столбцы являются максимальными

Time = c(0.1,0.2,0.3,0.4,0.5) 
Cell1 = c(1,5,10,4,2) 
Cell2 = c(1,5,4,11,5) 
Cell3 = c(1,9,5,9,5) 
df = data.frame(Time,Cell1,Cell2,Cell3) 

Что получает:

 Time Cell1 Cell2 Cell3 
1 0.1 1  1  1 
2 0.2 5  5  9 
3 0.3 10  4  5 
4 0.4 4 11  9 
5 0.5 2  5  5 

Теперь я пытаюсь извлечь время, при котором каждая ячейка имеет максимальную концентрацию фактора транскрипции выводить что-то вроде:

Cell1 0.3 
Cell2 0.4 
Cell3 0.2,0.4 

Извините, если это упрощенно, я новичок в R и долгое время спотыкался о форумах. Я могу сделать это путем запроса каждого столбца по отдельности, но у меня есть сотни клеток и было бы написать сценарий для каждого из них с моим текущим методом:

cell1_peak=which(df[2]==max(df[2]));cell1_time=df$Time[cell1_peak] 

Возможный способ использования функции применения с моим текущим методом и скомпилировать все ячейки для легкого экспорта?

ответ

5

Преобразование данных в формат «длинный», а затем использовать одну из множества функций агрегации в R.

Вот два подхода с "Таблица данных".

Сначала загрузите требуемые пакеты.

library(data.table) 
library(reshape2) 

Вариант 1: Держите данные длинными - более гибкими, чтобы работать с ними позже. (Я бы предпочел этот вариант.) Здесь вы можете использовать dcast.data.table, если вы хотите свернуть это, используя paste или какой-либо другой подход.

melt(as.data.table(df), id.vars = "Time")[, list(
    Time[value == max(value)]), by = variable] 
# variable V1 
# 1: Cell1 0.3 
# 2: Cell2 0.4 
# 3: Cell3 0.2 
# 4: Cell3 0.4 

Вариант 2: Сохраните результаты как столбец list. Предлагает большую гибкость для работы с данными позже, чем с использованием paste, но не многие люди ожидают, что столбец будет list.

melt(as.data.table(df), id.vars = "Time")[, list(
    list(Time[value == max(value)])), by = variable] 
# variable  V1 
# 1: Cell1  0.3 
# 2: Cell2  0.4 
# 3: Cell3 0.2,0.4 
+0

благодарственные! Я пошел со вторым вариантом, поскольку я предпочел, чтобы он дал ячейкам с несколькими точками времени в одной строке. Я также запомню ваш другой вариант, только если это вызывает проблемы позже. Опять же, спасибо, очень простое объяснение с аккуратным выходом. – Kevin

1

Попробуйте

apply(df[,-1], 2, function(x) 
      df$Time[x %in% max(x)]) 
#$Cell1 
#[1] 0.3 

#$Cell2 
#[1] 0.4 

#$Cell3 
#[1] 0.2 0.4 

Или

apply(df[,-1], 2, function(x) toString(df$Time[x == max(x)])) 
    #Cell1  Cell2  Cell3 
    #"0.3"  "0.4" "0.2, 0.4" 
0
apply(df[,-1],2,function(x){ 
        paste(df$Time[which(x==max(x))],collapse=",") 
       }) 

дает вам следующее:

Cell1  Cell2  Cell3 
"0.3"  "0.4" "0.2,0.4" 
Смежные вопросы