参考之前的观察并在 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.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"
所以我有这样的数据:
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.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"