假设有一个data.table,如下所示:
index.php?page=faq&lang=en
请参阅data.table:
exp <- structure(list(
id = c("a", "b"),
num1 = c(1L, 5L),
num2 = list(c(2L, 5L, 8L),
c(6L, 10L, 13L, 19L))),
.Names = c("id", "num1", "num2"),
row.names = c(NA, -2L),
class = c("data.table", "data.frame"))
另见结构:
exp
id num1 num2
1: a 1 2,5,8
2: b 5 6,10,13,19
我的问题是如何创建一个额外的列(比方说,diff),它将显示num1(整数)和num2(包含整数的列表)列之间的差异。对于第一行,它应显示 1,4,7 ,对于第二行,它应显示 1,5,8,14
以下代码显然不起作用:
str(exp)
Classes ‘data.table’ and 'data.frame': 2 obs. of 3 variables:
$ id : chr "a" "b"
$ num1: int 1 5
$ num2:List of 2
..$ : int 2 5 8
..$ : int 6 10 13 19
也没有
exp[, `:=`(diff = num1 - num2)]
任何帮助将不胜感激。
答案 0 :(得分:3)
可以使用Map
:
exp[, diff := Map("-", num2, num1)]
exp
# id num1 num2 diff
#1: a 1 2,5,8 1,4,7
#2: b 5 6,10,13,19 1, 5, 8,14
将num1值再循环到num2 list-element的长度,然后减去。 Map
始终返回列表结果。
答案 1 :(得分:2)
您的问题简化为有关从向量中减去列表的问题:
num1 <- c(1L, 5L)
num2 <- list(c(2L, 5L, 8L),
c(6L, 10L, 13L, 19L))
# Method A: these are both defined
num1[[1]] - num2[[1]]
num1[[2]] - num2[[2]]
# Method B: this is not:
num1 - num2
# This is how you programatically do Method A:
mapply(`-`, num1, num2)
只需将mapply调用放入数据表子集表达式中即可。