执行*应用于R中的列表列表

时间:2016-04-01 08:18:05

标签: r list vectorization

我有一个R(featuresList)中的向量列表,其格式为:

[[2]]
  [1] 1 0 0 1 1 0 1 1 1 0 1 1 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 0 1 0 0 1 0
 [93] 1 0 0 1 0 1 1 1 1 0 0 0 1 1 0 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 0 0 0
[[3]]
  [1] 0.64285714 0.74285714 0.78571429 0.57142857 0.60000000 0.68571429 0.67142857 0.64285714 0.74285714 0.71428571 0.57142857 0.42857143 0.72857143 0.54285714 0.64285714 0.65714286
 [17] 0.57142857 0.70000000 0.47142857 0.64285714 0.47142857 0.70000000 0.57142857 0.62857143 0.57142857 0.78571429 0.61428571 0.57142857 0.50000000 0.57142857 0.74285714 0.62857143

我已经写了这个for来将一个列表的每个元素与其他列表中的相应元素相加。在上面的示例中,列表[[2]]有两个列表,我想将此列表的每个元素与列表[[3]]中的元素相加。因此,我会将[[2]][1]中的1与[[3]][1]中的数字相加,即0.64285714,结果为1.64285714

起初我以为我想出了这个循环:

features <- 0
  for(i in seq_along(featuresList)){
    if(!(is.null(featuresList[[i]])))
      features<-features+ unlist(featuresList[[i]])
  }

并且工作正常:

[1] 1.6428571 0.7428571 0.7857143 1.5714286 1.6000000 0.6857143 1.6714286 1.6428571 1.7428571 0.7142857 1.5714286 1.4285714 0.7285714 1.5428571 0.6428571 1.6571429 1.5714286 0.7000000
[19] 1.4714286 1.6428571 1.4714286 0.7000000 1.5714286 1.6285714 1.5714286 0.7857143 1.6142857 1.5714286 1.5000000 1.5714286 0.7428571 1.6285714 1.6142857 0.7857143 1.5285714 1.5714286

它将第一个向量列表的每个元素与第二个向量列表的对应元素相加。但是我已经尝试了几天使用* apply重写这段代码而没有运气。

有人能暗示如何做吗?

1 个答案:

答案 0 :(得分:3)

如果我理解你的问题,你可以在列表中添加向量 - 而不使用*apply函数:

featuresList[[2]] + featuresList[[3]]
#[1] 1.6428571 0.7428571 0.7857143 1.5714286 1.6000000 0.6857143 1.6714286 1.6428571 1.7428571 0.7142857 1.5714286 1.4285714 0.7285714

如果我们想在列表中添加所有向量,我们可以使用Reduce(),如@akrun所建议的那样:

Reduce("+", featuresList)
#[1] 2.642857 1.742857 1.785714 2.571429 2.600000 1.685714 2.671429 2.642857 2.742857 1.714286 2.571429 2.428571 1.728571

这将返回列表中存储的所有向量的总和(请注意,在这种情况下,featuresList[[1]]是仅包含1的(已回收)向量。

我使用了您的数据子集:

featuresList <- list(1, c(1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0), c(0.64285714, 
0.74285714, 0.78571429, 0.57142857, 0.6, 0.68571429, 0.67142857, 
0.64285714, 0.74285714, 0.71428571, 0.57142857, 0.42857143, 0.72857143))