列列中的整数列和整数值之间的差异

时间:2018-03-08 07:38:00

标签: r data.table

假设有一个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)]

任何帮助将不胜感激。

2 个答案:

答案 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调用放入数据表子集表达式中即可。

相关问题