为什么应用的函数不适用于data.table中的所有行?

时间:2018-05-15 03:56:42

标签: r data.table

我有以下代码来获取字符串的第一部分,但是,它似乎不起作用。有人可以向我解释为什么它不起作用以及如何解决它。

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"]

谢谢!

1 个答案:

答案 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