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