如何从R中的数据表中有效提取划界字符串



i在r中具有一个数据表,其中具有结肠界定数据的文本列。我想返回一个结果矩阵/数据表,其中每个单元格返回一个分隔值之一。

下面粘贴的代码演示了问题,并且是一个有效的解决方案。但是,我的实际数据表很大(几千行和列(,并且粘贴的方法按一两分钟的顺序完成。

我想知道是否有更有效的方法执行此任务?看来fread中的sep2选项一旦实现了此问题。

谢谢!

> # Set up data.table
> DT <- data.table(A = c("cat:1:meow", "dog:2:bark", "cow:3:moo"),
                     B = c("dog:3:meow", "dog:4:bark", "frog:3:croak"),
                     C = c("dingo:0:moo", "cat:8:croak", "frog:1:moo"))
> print(DT)
        A            B           C
1: cat:1:meow   dog:3:meow dingo:0:moo
2: dog:2:bark   dog:4:bark cat:8:croak
3: cow:3:moo   frog:3:croak  frog:1:moo
# grab the second delimited value in each cell
> part_index <- 2
> f = function(x) {vapply(t(x), function(x) {unlist(strsplit(x, ":", fixed=T))[part_index]}, character(1))}
> sapply(DT, f)
    A   B   C  
[1,] "1" "3" "0"
[2,] "2" "4" "8"
[3,] "3" "3" "1"

1(sub 尝试以下:

DT[, lapply(.SD, sub, pattern = ".*:(.*):.*", replacement = "\1")]

给予:

   A B C
1: 1 3 0
2: 2 4 8
3: 3 3 1

2(fread 或使用fread

DT[, lapply(.SD, function(x) fread(paste(x, collapse = "n"))$V2)]

3(矩阵请注意,类似的代码将与无数据的普通字符矩阵一起使用。

m <- as.matrix(DT)
replace(m, TRUE, sub(".*:(.*):.*", "\1", m))

给予:

     A   B   C  
[1,] "1" "3" "0"
[2,] "2" "4" "8"
[3,] "3" "3" "1"

3a(甚至更简单(没有正则表达式(是:

replace(m, TRUE, read.table(text = m, sep = ":")$V2)

3B(或使用data.table的fread

replace(m, TRUE, fread(paste(m, collapse = "n"))$V2)

最新更新