Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 修改data.table中不带循环的列的值_R_Data.table - Fatal编程技术网

R 修改data.table中不带循环的列的值

R 修改data.table中不带循环的列的值,r,data.table,R,Data.table,我有一个如下所示的数据表 > head(mydt) name b c 1: ao 2 1 GiB 2: bo 2 1.4 Gib > head(mydt) name b c 1: ao 2 1 2: bo 2 1.4 现在,我试着做一些清理-我试着在没有任何循环的情况下从c列的值中删除单位,。。 我做了以下工作: mydt[,4 :=substr(c,0,gregexp

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

> head(mydt)
    name  b      c
1:  ao    2      1 GiB
2:  bo    2      1.4 Gib
> head(mydt)
    name  b      c
1:  ao    2      1
2:  bo    2      1.4
现在,我试着做一些清理-我试着在没有任何循环的情况下从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 GiB
2:  bo    2      1.4 Gib
> head(mydt)
    name  b      c
1:  ao    2      1
2:  bo    2      1.4
但是,它不起作用->它似乎对所有值使用相同的端点。我做错了什么?如何访问当前值?

您可以在data.table对象上使用dplyr,该对象单独计算每个值,而不仅仅是第一行。例如:

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
或者

使用数据表方法

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," "))]

我的问题不是从向量中提取数字->而是如何访问当前值以修改它!我尝试从c列的值中删除单位,可以很容易地解释为您要删除单位,即提取数字;考虑到你的LHS为:=,似乎你需要学习?:=和一个介绍性的data.table text。你是对的,我澄清了我的问题!
mydt[, c :=substr(c,0,str_start(c," "))]