【问题标题】:Splitting Column of a data.table拆分data.table的列
【发布时间】:2014-09-20 18:56:24
【问题描述】:

想知道如何拆分 data.table 的列。

可以使用以下代码轻松拆分data.frame 的列:

df <- data.frame(Test=c("A - B", "C - D"))
df
     Test
1 A - B
2 C - D
library(reshape2)
reshape2:::colsplit(string = df[,1], pattern = " ", names = c("Var1", "Space", "Var2"))

  Var1 Space Var2
1    A     -    B
2    C     -    D

但我尝试拆分 data.table 的列失败

library(data.table)
dt <- data.table(Test=c("A - B", "C - D"))
dt
    Test
1: A - B
2: C - D
reshape2:::colsplit(string = dt[,1, with=FALSE], pattern = " ", names = c("Var1", "Space", "Var2"))
Error: String must be an atomic vector

【问题讨论】:

  • 试试string = dt[[1]]
  • 感谢@Arun 的帮助。您能否更改您的评论以回答并解释[[1]] 背后的逻辑。谢谢
  • @MYaseen208,请使用class 来理解它。简而言之,当您执行df[,1] 时,它变成了一个向量(不再是data.frame),但是当您执行dt[,1, with=FALSE] 时,它仍然是一个data.tablecolsplit 的错误清楚地表明你必须给它一个原子向量,因此为了实现这一点,你要做dt[[1]]

标签: r data.table reshape reshape2


【解决方案1】:

我看到您特别要求 colsplit 提供一些东西,但我建议您查看其他一些替代方案,例如我的 cSplit 函数。

cSplit 方法如下:

setnames(cSplit(dt, "Test",  " "), c("Var1", "Space", "Var2"))[]
#    Var1 Space Var2
# 1:    A     -    B
# 2:    C     -    D

末尾的[] 是打印结果,但您也可以将结果存储为新的data.table


在效率方面比较如何?

fun1 <- function() {
  reshape2:::colsplit(string = dt[[1]], pattern = " ", 
                      names = c("Var1", "Space", "Var2"))
} 
fun2 <- function() {
  setnames(cSplit(dt, "Test",  " "), 
           c("Var1", "Space", "Var2"))[]
}

dt <- rbindlist(replicate(5000, dt, FALSE))
dim(dt)
# [1] 10000     1

library(microbenchmark)
microbenchmark(fun1(), fun2(), times = 10)
# Unit: milliseconds
#    expr        min         lq     median         uq        max neval
#  fun1() 2025.84703 2093.39687 2195.75822 2390.30666 2492.65946    10
#  fun2()   34.08966   36.01145   43.28036   47.45962   57.57615    10

为什么您的 colsplit 方法没有按预期工作?

dt[,1] 更像df[,1, drop = FALSE](试一试——你会得到与尝试“data.table”时相同的错误)。

您将需要以下任何一项:

> dt[[1]]
[1] "A - B" "C - D"
> dt$Test
[1] "A - B" "C - D"

这与你得到的相似:

> df[, 1]
[1] A - B C - D
Levels: A - B C - D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    相关资源
    最近更新 更多