R 变量的类是data.table中的列表
假设我有以下数据:R 变量的类是data.table中的列表,r,list,data.table,extract,R,List,Data.table,Extract,假设我有以下数据: library(data.table) library(tidyverse) Data <- data.table(A = c("foo 32.3 56.2421 4.5 3.66", "365.11 9812.3 foooo 5.66 8.31", "")) 它工作得很好,但是在第三行中,我在变量Number1到Number2中得到
library(data.table)
library(tidyverse)
Data <-
data.table(A = c("foo 32.3 56.2421 4.5 3.66",
"365.11 9812.3 foooo 5.66 8.31",
""))
它工作得很好,但是在第三行中,我在变量Number1
到Number2
中得到了NULL
(我想要NA
)
真正的问题是Number1
到Number4
的类是列表
,但我想要字符
(或者更好的是数字
,在下一步中)
我怎样才能做到这一点?我想使用一个带有提取和
数据的代码。table
您可以使用lappy
将值转换为数值,如果没有值,则返回NA
,然后将结果转置以创建两个新列
library(data.table)
Data[, c("Number1", "Number2") := lapply(stringr::str_extract_all(A, "\\d+"),
function(x) if(length(x)) as.numeric(x) else NA) %>% transpose()]
Data
# A Number1 Number2
#1: foo 32 56 32 56
#2: 365 9812 foooo 365 9812
#3: NA NA
使用
tidyr
的extract
可以执行以下操作:
tidyr::extract(Data, A, c("Number1", "Number2"),
'(\\d+).*(\\d+)', remove = FALSE, convert = TRUE)
# A Number1 Number2
#1: foo 32 56 32 6
#2: 365 9812 foooo 365 2
#3: NA NA
非常感谢。不幸的是,我正在寻找一个客户很容易理解的简单解决方案。@TobiSonne你是什么意思?我认为if(length(x))as.numeric(x)else NA的部分
函数(x)
相当复杂(不是对我来说,而是解释一下)。我特别不想解释为什么会有NULL
值。我正在搜索类似于tidyr
的separate
的东西,其中缺少的值会自动用NA
填充(但我不想在这里使用separate,因为我的真实数据的结构)。您可以使用tidyr
的提取功能。谢谢!我不知道这个功能。不幸的是,就我的实际情况而言,这也不起作用。我有四个数字,都是小数,我不想使用正则表达式(\\d+\\\.\\d+).*(\\d+\\.\\d+).*(\\d+\\.\\d+).*(\\d+\.\\d+).*(\\d+\\.\\d+)
tidyr::extract(Data, A, c("Number1", "Number2"),
'(\\d+).*(\\d+)', remove = FALSE, convert = TRUE)
# A Number1 Number2
#1: foo 32 56 32 6
#2: 365 9812 foooo 365 2
#3: NA NA