根据阈值汇总表

时间:2015-09-02 18:17:32

标签: r dplyr plyr

这可能是一个非常简单的问题。但是我没有使用我已知的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

3 个答案:

答案 0 :(得分:3)

将reshape2包与melt:

一起使用
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

答案 1 :(得分:3)

或者,如果您坚持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

答案 2 :(得分:1)

使用base R

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