2015-09-02 6 views
3

Это может быть очень простая проблема. Но мне это не удалось, используя мои известные функции dplyr. Вот данные:Подвести таблицу на основе порогового значения

tab1 <- read.table(header=TRUE, text=" 
    Col1 A1 A2 A3 A4 A5 
    ID1 43 52 33 25 59 
         ID2 27 41 20 71 22 
         ID3 37 76 36 27 44 
         ID4 23 71 62 25 63     
         ") 
tab1 
    Col1 A1 A2 A3 A4 A5 
1 ID1 43 52 33 25 59 
2 ID2 27 41 20 71 22 
3 ID3 37 76 36 27 44 
4 ID4 23 71 62 25 63 

Я намерен получить таблицу на случай непредвиденных обстоятельств, как следующие, сохраняя значения ниже 30

Col1 Col2 Val 
ID1 A4 25 
ID2 A1 27 
ID2 A3 20 
ID2 A5 22 
ID3 A4 27 
ID4 A1 23 
ID4 A4 25 

ответ

2

Или, если вы настаиваете на dplyr Несс, вы можете gather данные первого, а затем filter по желанию

library(dplyr) 
library(tidyr) 
tab1 %>% 
    gather(Col2, Val, -Col1) %>% 
    filter(Val < 30) 

# Col1 Col2 Val 
# 1 ID2 A1 27 
# 2 ID4 A1 23 
# 3 ID2 A3 20 
# 4 ID1 A4 25 
# 5 ID3 A4 27 
# 6 ID4 A4 25 
# 7 ID2 A5 22 
1

Использование baseR:

x<-apply(tab1, 1, function(y)y[y<30]) 
data.frame(Col1 = rep(tab1$Col1, sapply(x, length)), 
      Col2 = names(unlist(x)), 
      Val = unlist(x)) 
    Col1 Col2 Val 
1 ID1 A4 25 
2 ID2 A1 27 
3 ID2 A3 20 
4 ID2 A5 22 
5 ID3 A4 27 
6 ID4 A1 23 
7 ID4 A4 25 
+0

Я думаю, что вы могли бы фильтровать результирующий столбец вместо операциями строк с использованием 'применять', нет? –

3

использовать пакет reshape2 с расплавом:

library(reshape2) 
tab2 = melt(tab1) 
tab2[tab2$value < 30,] 

выход:

Col1 variable value 
2 ID2  A1 27 
4 ID4  A1 23 
10 ID2  A3 20 
13 ID1  A4 25 
15 ID3  A4 27 
16 ID4  A4 25 
18 ID2  A5 22 
+2

Кроме того, поскольку у них есть 'dplyr' open:' melt (tab1)%>% filter (значение <30) 'или базовый R аналог' subset (расплав (tab1), значение <30) ' – Frank

+0

@Frank благодарит вас за добавив, что комментарий – pcantalupo

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