修改data.table中的列值而无循环

时间:2018-12-17 20:53:40

标签: r data.table

我有一个如下所示的数据表

> head(mydt)
    name  b      c
1:  ao    2      1 GiB
2:  bo    2      1.4 Gib

现在,我尝试进行一些清理-我尝试从c列的值中删除该单元,而没有任何循环,.. 我做了以下事情:

mydt[,4 :=substr(c,0,gregexpr(pattern=' ',c)[[1]][1]-1)]

我得到的是这样的:

> head(mydt)
    name  b      c
1:  ao    2      1 G
2:  bo    2      1.4

我期望的是以下

> head(mydt)
    name  b      c
1:  ao    2      1
2:  bo    2      1.4

但是,它不起作用->似乎所有值都使用相同的端点。我做错了什么?如何访问“当前”值?

2 个答案:

答案 0 :(得分:1)

您可以在dplyr对象上使用data.table,该对象将分别评估每个值,而不只是第一行。例如:

library(dplyr)
library(data.table)

mydt<-data.table(name = c('ao','bo'), b = c(2,2), c = c("1 GiB", "1.4 GiB"))
mydt %>% 
  mutate(d = as.numeric(gsub(" GiB","",c)))

  name b       c   d
1   ao 2   1 GiB 1.0
2   bo 2 1.4 GiB 1.4

答案 1 :(得分:0)

mydt <- data.table(name = c("ao","bo"),
                   b = c(2,2),
                   c = c("1 GiB", "1.4 Gib"))

我们可以采取几种方法。

使用tidyverse:

mydt %>% mutate(c = parse_number(c))

或者,

mydt %>% separate(col = c,into = "c",sep = " ",convert = T)

使用data.table方法

mydt[,
     c := tstrsplit(c," ", fixed = TRUE, keep = 1L)]

给出以c列为字符的输出。

要获取c作为数字输出:

mydt[,
     c := tstrsplit(c," ", fixed = TRUE, keep = 1L)
     ][,
       c := as.numeric(c)]

您的原始代码可以替换为以下代码:

mydt[, c :=substr(c,0,str_start(c," "))]