【问题标题】:Refer to previous observation and concatenate strings with a condition in R参考之前的观察结果并将字符串与 R 中的条件连接起来
【发布时间】:2015-09-01 04:12:43
【问题描述】:

所以我有这样的数据:

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)&amp;A2,A2)。 我知道这会增加额外的空间,但这对于数据的进一步处理并不重要。

我正在努力寻找 R 中的解决方案,但我找到了 thisthis 以了解如何在 data.table 中引用先前的值。但是,我一直坚持如何使用这些命令来检查 if 条件和 paste 字符串。

【问题讨论】:

  • 输入数据集中只有一列。我认为最好将它放在输出的两列中
  • 另外,在您的 Excel 示例中,与上面的示例相反,您还有 B 列。
  • @akrun,嗯,这就是我在 Excel 中所做的,但我不知道如何在 R 中开始。我得到了a[, B := c(NA, a[seq_len(.N-1)])][],它给了我列 B,之前的值为a。但我觉得这不是正确的起点。
  • 试试a[, tstrsplit(a, '\\s+')][, V1:=cumsum(V1!='')]

标签: r data.table


【解决方案1】:

试试

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"

【讨论】:

  • 我也是这么想的,但也许最好添加type.convert 和列名,比如a[, c("a", "b") := tstrsplit(a, "\\s+", type.convert = TRUE)][, a := cumsum(!is.na(a))]。另外,我想知道cumsum 将永远有效...
  • 好吧,对于程序的其余部分,我需要将结果再次作为字符向量,但我想我可以将列重新连接在一起。看来我目前的主要问题是我无法获得 R 和 data.table 的更新版本(仍然是 3.0.2 和 1.8.10)。
  • @DavidArenburg 谢谢,我使用cumsum 作为分组变量的唯一原因是因为您提到的疑问。如果值是随机的,则可能有问题。
  • 顺便说一句,您的解决方案没有就地修改数据。如果你在后面输入a,你就会回到原来的数据集。
  • @akrun 是的,非常感谢!现在我有了一个完整的 R 脚本,我可以运行它并且不再需要在 Excel 中手动执行该步骤。将这两种方式与identical() 进行比较是正确的。一旦我更新了我的 R,我当然会实现 data.table 例程。
猜你喜欢
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多