所以我有这样的数据:
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和this有关如何引用data.table
中的先前值的问题。但是,我仍然坚持如何使用这些命令检查if-condition和paste
字符串。
答案 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.locf
和base 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"