我有以下代码来获取字符串的第一部分,但是,它似乎不起作用。有人可以向我解释为什么它不起作用以及如何解决它。
library(data.table)
demo <- data.table(ID = c("1234-123", "1521-111", "1214-113", "1412-912"))
demo[, new := lapply(.SD, function(x){
strsplit(x, "-")[[1]][1]
}), .SDcols = "ID"]
谢谢!
答案 0 :(得分:3)
我们可以使用sub
删除以-
开头的子字符串和“ID”中的任何其他字符(.*
)并将其分配给:=
'新'
demo[, new := sub("-.*", "", ID)]
demo
# ID new
#1: 1234-123 1234
#2: 1521-111 1521
#3: 1214-113 1214
#4: 1412-912 1412
关于为什么OP'功能不起作用,如果我们检查strsplit
list
元素的提取方式([[1]]
),就会变得清晰。在这里,我们只提取第一个列表元素。由于只有列“ID”,我们不需要.SD
demo[, new := unlist(lapply(strsplit(ID, "-") , `[`, 1))]
在上面的代码中,我们将“ID”拆分为-
,使用list
循环遍历lapply/sapply
元素,并提取第一个元素以将其指定为“new”。如果是lapply
,它仍然是list
,因此在分配之前我们unlist