【问题标题】:Fill R datatable upon condition with it's own value用自己的值填充R数据表
【发布时间】:2021-02-02 02:11:49
【问题描述】:

以这张数据表为例:

    ID   Type   W     X        Y        Z       D   stderr Zscore  BABA  ABBA  nsnps
1: D14     OG   P1    P2       X1 OUTGROUP  0.0000 0.000000 -4.100     0     0      0
2: D14     OG   P1    P2       X2 OUTGROUP  0.0000 0.000000  7.200     0     0      0
3: D14     OG   P1    P2       X3 OUTGROUP  0.0000 0.000000 -2.000     0     0      0
4: D14    REP   P1    P2       X1 OUTGROUP -0.0281 0.005291 -5.317 46148 48819 869128
5: D14    REP   P1    P2       X2 OUTGROUP  0.0413 0.005276  7.837 43594 40132 751945
6: D14    REP   P1    P2       X3 OUTGROUP -0.0177 0.005773 -3.072 43764 45344 787440
7: D14    EXP   P1    P2       X1 OUTGROUP -0.0226 0.006499 -3.485 44643 46712 835427
8: D14    EXP   P1    P2       X2 OUTGROUP  0.0472 0.006721  7.030 44123 40142 758734
9: D14    EXP   P1    P2       X3 OUTGROUP -0.0173 0.006892 -2.509 45022 46606 809031

我正在尝试向所有类型不同于“OG”的行添加一列。在这个新列中,我试图将 Zscore 从具有“OG”类型的相应行中放入。 这是预期的输出:

    ID   Type   W     X        Y        Z       D   stderr Zscore  BABA  ABBA  nsnps.  Zexpect
1: D14     OG   P1    P2       X1 OUTGROUP  0.0000 0.000000 -4.100     0     0      0  NA
2: D14     OG   P1    P2       X2 OUTGROUP  0.0000 0.000000  7.200     0     0      0  NA
3: D14     OG   P1    P2       X3 OUTGROUP  0.0000 0.000000 -2.000     0     0      0  NA
4: D14    REP   P1    P2       X1 OUTGROUP -0.0281 0.005291 -5.317 46148 48819 869128  -4.100
5: D14    REP   P1    P2       X2 OUTGROUP  0.0413 0.005276  7.837 43594 40132 751945   7.200
6: D14    REP   P1    P2       X3 OUTGROUP -0.0177 0.005773 -3.072 43764 45344 787440  -2.000 
7: D14    EXP   P1    P2       X1 OUTGROUP -0.0226 0.006499 -3.485 44643 46712 835427   -4.100
8: D14    EXP   P1    P2       X2 OUTGROUP  0.0472 0.006721  7.030 44123 40142 758734   7.200
9: D14    EXP   P1    P2       X3 OUTGROUP -0.0173 0.006892 -2.509 45022 46606 809031  -2.000   

如果带有“OG”的行包含他们自己的 ZScore,这不是问题。我尝试这样做但没有成功:

DT[Type!="OG", Zexpect:=Zscore, .("ID","Type")]

谢谢!

【问题讨论】:

    标签: r if-statement data.table


    【解决方案1】:

    根据您是否关心 Zexpect 是“OG”组的 NA,这应该适用于该数据集:

    DT[, Zexpect:= first(Zscore), by = .(ID, Y)]
    

    为了更加健壮,您可能希望自己重新加入:

    DT[DT[Type == "OG"], on = .(ID, Y), Zexpect := i.Zscore]
    

    在任何一种情况下,如果重要的话,将Zexpect 分配回 NA 会很简单:

    ## cleanup
    DT[Type == "OG", Zexpect := NA_real_]
    
    DT
    
    ##     ID Type  W  X  Y        Z       D   stderr Zscore  BABA  ABBA  nsnps Zexpect
    ## 1: D14   OG P1 P2 X1 OUTGROUP  0.0000 0.000000 -4.100     0     0      0      NA
    ## 2: D14   OG P1 P2 X2 OUTGROUP  0.0000 0.000000  7.200     0     0      0      NA
    ## 3: D14   OG P1 P2 X3 OUTGROUP  0.0000 0.000000 -2.000     0     0      0      NA
    ## 4: D14  REP P1 P2 X1 OUTGROUP -0.0281 0.005291 -5.317 46148 48819 869128    -4.1
    ## 5: D14  REP P1 P2 X2 OUTGROUP  0.0413 0.005276  7.837 43594 40132 751945     7.2
    ## 6: D14  REP P1 P2 X3 OUTGROUP -0.0177 0.005773 -3.072 43764 45344 787440    -2.0
    ## 7: D14  EXP P1 P2 X1 OUTGROUP -0.0226 0.006499 -3.485 44643 46712 835427    -4.1
    ## 8: D14  EXP P1 P2 X2 OUTGROUP  0.0472 0.006721  7.030 44123 40142 758734     7.2
    ## 9: D14  EXP P1 P2 X3 OUTGROUP -0.0173 0.006892 -2.509 45022 46606 809031    -2.0
    

    【讨论】:

    • 谢谢,在我的示例中我可能不够具体,因为非健壮确实将第一个“OG”复制到所有这些。第二个选项工作得很好!再次感谢!
    【解决方案2】:

    对于WXY 的每个值,您可以为Type = 'OG' 获得对应的Zscore

    library(data.table)
    setDT(DT)
    DT[, Zexpect:= Zscore[Type == 'OG'], .(W, X, Y)]
    DT[Type == 'OG', Zexpect := NA_real_]
    DT
    
    #    ID Type  W  X  Y        Z       D   stderr Zscore  BABA  ABBA  nsnps Zexpect
    #1: D14   OG P1 P2 X1 OUTGROUP  0.0000 0.000000 -4.100     0     0      0      NA
    #2: D14   OG P1 P2 X2 OUTGROUP  0.0000 0.000000  7.200     0     0      0      NA
    #3: D14   OG P1 P2 X3 OUTGROUP  0.0000 0.000000 -2.000     0     0      0      NA
    #4: D14  REP P1 P2 X1 OUTGROUP -0.0281 0.005291 -5.317 46148 48819 869128    -4.1
    #5: D14  REP P1 P2 X2 OUTGROUP  0.0413 0.005276  7.837 43594 40132 751945     7.2
    #6: D14  REP P1 P2 X3 OUTGROUP -0.0177 0.005773 -3.072 43764 45344 787440    -2.0
    #7: D14  EXP P1 P2 X1 OUTGROUP -0.0226 0.006499 -3.485 44643 46712 835427    -4.1
    #8: D14  EXP P1 P2 X2 OUTGROUP  0.0472 0.006721  7.030 44123 40142 758734     7.2
    #9: D14  EXP P1 P2 X3 OUTGROUP -0.0173 0.006892 -2.509 45022 46606 809031    -2.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多