2015-07-24 3 views
0

У меня есть таблица Кальесы «p-значение» 61 столбцов:R вектор приращения для цикла

  • первая это имя образец «IdEch»
  • все остальные столбцы являются различной pvalues ​​названной Pvalue1 к Pvalue60 Я хотел бы, чтобы выбрать все «IdEch», что дисплей МИНИМУМ одно значение < 0,01

Я попытался, делая для цикла на каждой колонке (что выберите p-значение < 0,01) Но я не» t управлять r ecord IdEch в векторе. Я просто номер столбца ... который бесполезно ... Я не удается найти решение ....

Вот мой сценарий:

res = data.frame() 

list_pvalue = c() 

for (i in 2:ncol(pvalue)) { 

    res = subset(pvalue , pvalue[,i] < 0.01) 

    list_pvalue = c(res$IdEch,list_pvalue) 

} 

list_pvalue = unique(list_pvalue) 

ответ

2

Вы почти там , Вы хотите найти строки, для которых любые pvalues ​​являются < 0.01, для каждой строки.

Чтобы сделать что-то для каждой строки, используйте apply. Для того, чтобы увидеть, если any значения истинны, используйте any (?apply, ?any)

# pvalue[, -1] selects all but the first column 
# pvalue[, -1] < 0.01 is a logical dataframe of TRUE/FALSE 
# apply(X, 1, FUN) applys FUN to each row of X 
# apply(pvalue[, -1] < 0.01, 1, any) is TRUE for each row that has a pvalue < 0.01 
pvalue[apply(pvalue[, -1] < 0.01, 1, any), ] # is what you are after 
+0

Спасибо! Ваш ответ и это @kasterma работают отлично. Я выбрал ваш, потому что время работы немного короче. – Sandrine

2

Try ниже пример

#dummy data 
set.seed(123) 
pvalue <- data.frame(IdEch=paste0("ID",1:10), 
        Pvalue1=runif(10,0,0.05), 
        Pvalue2=runif(10,0,0.05), 
        Pvalue3=runif(10,0,0.05), 
        Pvalue4=runif(10,0,0.05),stringsAsFactors = FALSE) 

pvalue 
# IdEch  Pvalue1  Pvalue2  Pvalue3  Pvalue4 
# 1 ID1 0.014378876 0.047841667 0.044476966 0.048151212 
# 2 ID2 0.039415257 0.022666708 0.034640170 0.045114952 
# 3 ID3 0.020448846 0.033878532 0.032025341 0.034535264 
# 4 ID4 0.044150870 0.028631670 0.049713489 0.039773371 
# 5 ID5 0.047023364 0.005146234 0.032785290 0.0
# 6 ID6 0.002277825 0.044991249 0.035426523 0.023889799 
# 7 ID7 0.026405274 0..027203301 0.037922977 
# 8 ID8 0.044620952 0.002102977 0.029707101 0.010820397 
# 9 ID9 0.027571751 0.016396036 0.014457987 0.015909050 
# 10 ID10 0.022830737 0.047725182 0.007355682 0.011581289 

pvalue[ rowSums(pvalue[,-1] < 0.01) > 1, "IdEch" ] 
# [1] "ID5" 
+0

Очень удобный вариант. Я удалил «IdEch», иначе он не работал.:. pvalue [rowSums (pvalue [, - 1] < 0.01) > = 1,] – Sandrine

+0

@Sandrine Он работает с фиктивными данными, если ваша структура данных отличается от моего примера, то, пожалуйста, предоставьте воспроизводимые данные. – zx8754

2
pvalue[-1] 

дает кадр данных без столбца IdEch. Применяя pmin, вы получите минимальные значения в каждой строке. Если какое-либо значение меньше 0,01, то минимальное значение.

do.call("pmin", pvalue[-1]) < 0.01 

затем дает строковые указатели, которые имеют небольшие значения. Так что

pvalue[do.call("pmin", pvalue[-1]) < 0.01] 

должно быть тем, что вы хотите.

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