【问题标题】:Add two columns to a dataframe based on what value appears first [duplicate]根据首先出现的值将两列添加到数据框[重复]
【发布时间】:2020-08-21 11:07:55
【问题描述】:

我有一个数据框,df

df <- structure(list(ID = c("ID1", "ID2", "ID3", "ID4", "ID5", "ID6"
), val1 = c(0, 1, 0, 0, 0, 0), sig1 = c(0.76, 0.15, 0.35, 0.66, 
0.7, 0.72), val2 = c(0.25, 0.81, 0.21, 0.06, 0.18, NA), sig2 = c(0.65, 
0.09, 0.55, 0.88, 0.09, NA), val3 = c(0.26, 0.24, 0.16, -0.1, 
0.22, NA), sig3 = c(0.64, 0.62, 0.65, 0.8, 0.04, NA)), row.names = c(NA, 
6L), class = "data.frame")

> df
   ID val1 sig1 val2 sig2  val3 sig3
1 ID1    0 0.76 0.25 0.65  0.26 0.64
2 ID2    1 0.15 0.81 0.09  0.24 0.62
3 ID3    0 0.35 0.21 0.55  0.16 0.65
4 ID4    0 0.66 0.06 0.88 -0.10 0.80
5 ID5    0 0.70 0.18 0.09  0.22 0.04
6 ID6    0 0.72   NA   NA    NA   NA

此数据帧包含每个 ID 号的 3 对数据 - val1sig1val2sig2val3sig3

我想再添加 2 列。我希望第一列 (first_val) 说明第一个“val”列的名称,其中关联的“sig”列小于 0.5。在第二列 (first_val_value) 中,我想粘贴该 ID 的关联 val1val2 值。

所以例如 -

对于ID1,所有sig 值都不小于0.5,因此first_val 列条目应为“-”。

对于ID2sig1 小于 0.5,因此first_val 列条目应为“val1”。

对于ID3sig1 小于 0.5,因此first_val 列条目应为“val1”。

对于ID4,所有sig 值都不小于0.5,因此first_val 列条目应为“-”。

对于ID5sig2 小于 0.5,因此 first_val 列条目应为“val2”。

对于ID6sig 的值都不小于 0.5,因此first_val 列条目应为“-”。

所以我想要的数据框看起来像这样:

> df
   ID val1 sig1 val2 sig2  val3 sig3 first_val first_val_value
1 ID1    0 0.76 0.25 0.65  0.26 0.64         -               -
2 ID2    1 0.15 0.81 0.09  0.24 0.62      val1               1
3 ID3    0 0.35 0.21 0.55  0.16 0.65      val1               0
4 ID4    0 0.66 0.06 0.88 -0.10 0.80         -               -
5 ID5    0 0.70 0.18 0.09  0.22 0.04      val2            0.18
6 ID6    0 0.72   NA   NA    NA   NA         -               -

构建此数据框的最佳方法是什么?

【问题讨论】:

    标签: r


    【解决方案1】:

    获取长格式数据,filter小于0.5的值,每个ID只保留第一行,并加入数据以取回原始数据。

    library(dplyr)
    df %>%
      tidyr::pivot_longer(cols = -ID, 
                   names_to = c('.value', 'first_val'), 
                   names_pattern = '([a-z]+)(\\d+)') %>%
      filter(sig < 0.5) %>%
      group_by(ID) %>%
      slice(1L) %>%
      mutate(first_val  = paste0('val', first_val)) %>%
      select(-sig) %>%
      right_join(df, by = 'ID')  %>%
      arrange(ID)
      
    
    #  ID    first_val   val  val1  sig1  val2  sig2  val3  sig3
    #  <chr> <chr>     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    #1 ID1   NA        NA        0  0.76  0.25  0.65  0.26  0.64
    #2 ID2   val1       1        1  0.15  0.81  0.09  0.24  0.62
    #3 ID3   val1       0        0  0.35  0.21  0.55  0.16  0.65
    #4 ID4   NA        NA        0  0.66  0.06  0.88 -0.1   0.8 
    #5 ID5   val2       0.18     0  0.7   0.18  0.09  0.22  0.04
    #6 ID6   NA        NA        0  0.72 NA    NA    NA    NA   
    

    【讨论】:

      猜你喜欢
      • 2019-07-17
      • 1970-01-01
      • 2019-08-22
      • 2016-11-29
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      相关资源
      最近更新 更多