我有一个如下所示的数据表
> 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
但是,它不起作用->似乎所有值都使用相同的端点。我做错了什么?如何访问“当前”值?
答案 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," "))]