在 R 中合并具有重复项的成对列
Merging paired columns with duplication in R
晚上好,我正在研究两种血压(无创血压和动脉血压)的数据,每个人的持续时间不同。它有 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_timeid'1'没有'0'。
你能帮我正确合并吗?
更新 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
晚上好,我正在研究两种血压(无创血压和动脉血压)的数据,每个人的持续时间不同。它有 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_timeid'1'没有'0'。 你能帮我正确合并吗?
更新 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