【问题标题】:Merging paired columns with duplication in R在R中合并具有重复的配对列
【发布时间】:2022-01-18 17:49:42
【问题描述】:

晚安,我正在处理两种血压(无创和动脉)的数据,每个人的持续时间不同。它有 6 列“id”“begin_time”“end_time”“nibp_time”“nibp_value”“abp_time”“abp_value”。 我使用 difftime() 来降低复杂性。 “nibp_value”或“abp_value”之间的时间间隔为 5 分钟。所以我的数据如下所示。

df <- data.frame(id = c(1,1,1,1,1,1,1,1,2,2,2,2,3,3), 
                 nibp_time = c(0,1,0,1,0,1,0,1,0,1,2,3,NaN,NaN), 
                 nibp_value = c(80,65,80,65,80,65,80,65,95,90,83,89,NaN,NaN),
                 abp_time = c(1,1,2,2,3,3,4,4,NaN,NaN,NaN,NaN,0,1), 
                 abp_value = c(68,68,66,66,70,70,73,73,NaN,NaN,NaN,NaN,88,84))

问题是,有缺失值,我想根据“nibp_time”和“abp_time”合并“nibp_value”和“abp_value”。如果“nibp_time”等于“abp_time”,则应该存储“abp_value”(“abp_value”优先),如下所示。

df2<- data.frame(id = c(1,1,1,1,1,2,2,2,2,3,3),
           bp_time = c(0,1,2,3,4,0,1,2,3,0,1),
           bp_value = c(80,68,66,70,73,95,90,83,89,88,84))

这样我就可以申请了

as.data.table(df2)[, dcast(.SD, id ~ bp_time, value.var = "bp_value")]

使其成为串行格式。

我试过了

df$bp_time <- ifelse(is.na(df$abp_time), df$nibp_time, df$abp_time)

这样,id '1' 在时间 '0' 的值将被消除,因为 abp_time 没有 id '1' 的 '0'。 你能帮我正确合并吗?

【问题讨论】:

    标签: r dataframe merge multiple-columns


    【解决方案1】:

    16.12 更新:

    library(data.table)
    
    df <- data.table(id = c(1,1,1,1,1,1,1,1,2,2,2,2,3,3), 
                     nibp_time = c(0,1,0,1,0,1,0,1,0,1,2,3,NaN,NaN), 
                     nibp_value = c(80,65,80,65,80,65,80,65,95,90,83,89,NaN,NaN),
                     abp_time = c(1,1,2,2,3,3,4,4,NaN,NaN,NaN,NaN,0,1), 
                     abp_value = c(68,68,66,66,70,70,73,73,NaN,NaN,NaN,NaN,88,84))
    
    
    df[, `:=`(bp_time = ifelse(!is.na(nibp_time) & (nibp_time == 0 | is.na(abp_time)), nibp_time, abp_time),
              bp_value = ifelse(!is.na(nibp_time) & (nibp_time == 0 | is.na(abp_time)), nibp_value, abp_value))]
    
    df2 = unique(df[, c(1,6,7)], by=c("id", "bp_time"))
    

    输出:

    > df2
        id bp_time bp_value
     1:  1       0       80
     2:  1       1       68
     3:  1       2       66
     4:  1       3       70
     5:  1       4       73
     6:  2       0       95
     7:  2       1       90
     8:  2       2       83
     9:  2       3       89
    10:  3       0       88
    11:  3       1       84
    

    验证:

    df_check<- data.table(id = c(1,1,1,1,1,2,2,2,2,3,3),
                          bp_time = c(0,1,2,3,4,0,1,2,3,0,1),
                          bp_value = c(80,68,66,70,73,95,90,83,89,88,84))
    > df2 == df_check
            id bp_time bp_value
     [1,] TRUE    TRUE     TRUE
     [2,] TRUE    TRUE     TRUE
     [3,] TRUE    TRUE     TRUE
     [4,] TRUE    TRUE     TRUE
     [5,] TRUE    TRUE     TRUE
     [6,] TRUE    TRUE     TRUE
     [7,] TRUE    TRUE     TRUE
     [8,] TRUE    TRUE     TRUE
     [9,] TRUE    TRUE     TRUE
    [10,] TRUE    TRUE     TRUE
    [11,] TRUE    TRUE     TRUE
    

    【讨论】:

    • 感谢您的快速回复。它产生了类似的结果,但您的第一个解决方案消除了 id “3”,因为它没有 NIBP 值。 .. 更新的解决方案已重复,并且 abp_time 和 nibp_time 相同,只有 abp_value 应该保留并且 nibp_value 被删除...。 id 不应该被删除,因为 bp 属于每个 ids..
    • 我使用了您更新的解决方案,并从中制作了另一个带有“id”“final_value”和“final_time”的数据框。使用 unique() 作为结果,我得到了我想要的。万分感谢!!!!!!
    • 哦........对不起,我让你感到困惑............ .......... 这不是我想要的。我想将 df 制作为 df2,而不是从 df 和 df2 制作 df3。 T_T
    • 非常感谢您的更新。我认为您的解决方案是最好的,因为我的真实数据很少。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 2022-01-02
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 2021-01-06
    • 2015-11-22
    • 2019-03-17
    相关资源
    最近更新 更多