参考之前的观察并在 R 中将字符串与条件连接起来

Refer to previous observation and concatenate strings with a condition in R

所以我有这样的数据:

a <- data.table("a"=c("1    42","     84","2    10","3    12","     24"))
        a
1: 1    42
2:      84
3: 2    10
4: 3    12
5:      24

数据是单个排序向量,由 ID 为 1、2 和 3 的字符串以及 ID 上的数据组成。

为了进一步处理,我需要在缺失的地方填写身份证号码。 ID与数据之间的空格个数,以及没有ID时数据前的空格个数是固定的。示例中 ID 和数据之间有 4 个空格,如果没有 ID,则为 5 个空格。结果应如下所示:

a <- data.table("a"=c("1    42","1    84","2    10","3    12","3    24"))
        a
1: 1    42
2: 1    84
3: 2    10
4: 3    12
5: 3    24

我在 Excel 中解决了这个问题,方法是将第一个单元格 A1 复制到 B1 并在 B2 中使用此公式:=IF(LEFT(A2,5)=" ",LEFT(B1,5)&A2,A2)。 我知道这会增加额外的空间,但这对数据的进一步处理无关紧要。

我正在努力寻找 R 中的解决方案,但我发现 this and this 如何在 data.table 中引用先前的值。但是,我坚持如何使用这些命令来检查 if-condition 和 paste 一起检查字符串。

尝试

library(data.table)#v1.9.5+
a[, c("a", "b") := tstrsplit(a, "\s+")][, a:=a[a!=''], cumsum(a!='')]
#    a  b
#1:  1 42
#2:  1 84
#3:  2 10
#4:  3 12
#5:  3 24

或@David Arenburg 建议的修改

 a[, c("a", "b") := tstrsplit(a, "\s+", type.convert = TRUE)][,
                 a := cumsum(!is.na(a))]

或使用 na.locfbase R

 library(zoo)
 m1 <- do.call(rbind,lapply(strsplit(a$a, '\s+'), as.numeric))
 m1[,1] <- na.locf(m1[,1])

 m1[,1] <- ave(m1[,1], cumsum(!is.na(m1[,1])), FUN=function(x) x[!is.na(x)])

 do.call(paste, as.data.frame(m1))
 #[1] "1 42" "1 84" "2 10" "3 12" "3 24"