为 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
我在数据 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