请参阅先前的观察并使用R

时间:2015-06-16 11:10:43

标签: r data.table

所以我有这样的数据:

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中找到解决方案,但我发现thisthis有关如何引用data.table中的先前值的问题。但是,我仍然坚持如何使用这些命令检查if-condition和paste字符串。

1 个答案:

答案 0 :(得分:4)

尝试

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"