为 R 数据列表中的每个数字提取前两位数字 table

Extract first two digits for each number in the list in R data table

我在数据 table 中有一列包含购买代码。如果在我的合同中(每个合同 = 新行)有一次购买,那么代码编号只是一个字符类型变量(例如,11.25.64)。但是,如果我的合同有多次购买,那么代码将存储在一个列表中。看起来像这样

dt n  codes
   1  11.25.64
   2  c('11.25.16', '25.84.78', '78.26.99')
   3  81.62.16
   4  c('16.25.16', '99.84.78', '28.26.99') 

出于分类的目的,我只想提取每个代码的前两位数字。所以,我想创建一个新列并获得如下内容:

 dt n  classification_codes
    1  11
    2  c('11', '25', '78')
    3  81
    4  c('16', '99', '28') 

我尝试执行以下代码

dt$classification_codes<- substr(dt$codes, start = 1, stop = 2)

然而,它只适用于我有一个代码的行,但对于具有列表变量的行,它给出 'c('

dt n  classification_codes
    1  11
    2  c(
    3  81
    4  c(

然后我尝试使用不同的方法并做类似这样的事情

dt$classification_codes <- lapply(str_split(dt$codes, " "), substr, 1, 3)

但我得到以下输出。这似乎更接近我想要的,但事实并非如此。当我执行代码时,好像列表中的第一个变量不可读

 dt n  classification_codes
    1  11
    2  c("c(", "\"25","\"78")
    3  81
    4  c("c(", "\"99", "\"28")

您可以尝试使用库 stringr:

a <- c('11.25.16', '25.84.78', '78.26.99')

str_split(a, "\.")

这给了你一个列表

> str_split(a, "\.")
[[1]]
[1] "11" "25" "16"

[[2]]
[1] "25" "84" "78"

[[3]]
[1] "78" "26" "99"

我试图根据给出的新信息来解决你的问题,所以我为你写了一个丑陋的函数:

extractor <- function(string) {
  tmp <- vector()
  if (grepl("^(c[[:punct:]]{2}\d\d\.\d\d\.\d\d)", string)) {
    tmp <- string %>% 
          str_extract("^(c[[:punct:]]{2}\d\d\.\d\d\.\d\d)") %>%
          str_extract("\d\d\.\d\d\.\d\d") %>%
          str_split("\.")
    tmp <-  paste0("c('", tmp[[1]][1],"', '", tmp[[1]][2], "', '", tmp[[1]][3],"')")
  } else {
    tmp <- string %>%
      str_extract("^(\d\d)")
  }
  return(tmp)
}

我想你必须使用

df$new_line <- df$codes %>% lapply(extractor) %>% unlist