【问题标题】:Summarize Table based on a Threshold基于阈值的汇总表
【发布时间】:2015-09-02 18:17:31
【问题描述】:

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

【问题讨论】:

    标签: r dplyr plyr


    【解决方案1】:

    或者如果你坚持dplyrness,你可以根据需要先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】:

      使用带有melt的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
      

      【讨论】:

      • 另外,因为他们有 dplyr 开放:melt(tab1) %&gt;% filter(value &lt; 30) 或基本 R 类似物 subset( melt(tab1), value &lt; 30)
      【解决方案3】:

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

      【讨论】:

      • 我认为您可以使用apply 过滤结果列而不是按行操作,不是吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-26
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多