相互减去列表

时间:2015-11-15 13:15:56

标签: r

我试图从另一个列表中的所有文件中减去一个列表中包含的所有文件。我在两个列表中都有64个项目,数据结构如下:

FUTURE    List of 64

file1 :'data.frame': 240 obs of 4 variables:
..$V1: int [1:240] 1986 1986 1986 1986...
..$V2: int [1:240] 1 2 3 4...
..$V3: int [1:240] 16 15 16 16...
..$V4: int [1:240] 154 118 137 128...
----------------------------------------------
file64:'data.frame': 240 obs of 4 variables:
..$V1: int [1:240] 1986 1986 1986 1986...
..$V2: int [1:240] 1 2 3 4...
..$V3: int [1:240] 16 15 16 16...
..$V4: int [1:240] 122 189 107 114...
----------------------------------------------

    BASE    List of 64

file1 :'data.frame': 240 obs of 4 variables:
..$V1: int [1:240] 1986 1986 1986 1986...
..$V2: int [1:240] 1 2 3 4...
..$V3: int [1:240] 16 15 16 16...
..$V4: int [1:240] 133 178 157 146...
----------------------------------------------
file64:'data.frame': 240 obs of 4 variables:
..$V1: int [1:240] 1986 1986 1986 1986...
..$V2: int [1:240] 1 2 3 4...
..$V3: int [1:240] 16 15 16 16...
..$V4: int [1:240] 125 177 157 133...
----------------------------------------------

我只想从FUTURE列表中包含的所有文件的同一列中减去BASE列表中包含的所有文件的第四列($ V4)。

如果这些是简单的数据帧,我可以使用:

CALC=FUTURE$V4-BASE$V4

但当然列表有点复杂。

我试过了:

CALC=lapply(FUTURE, function(x) x["V4"] - BASE["V4"])

但我收到错误消息:

 Error in data.frame(value, row.names = rn, check.names = FALSE, check.rows  = FALSE) :
row names supplied are of the wrong length 

关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:1)

我们可以使用Map从' BASE'的相应list元素中减去列。和' FUTURE'。

CALC <- setNames(data.frame(Map(function(x, y) x[,4]-y[,4], 
                           BASE, FUTURE)), paste0('V', seq_along(BASE)))

由于OP使用了lapplylapply的一种方法是遍历其中一个list的序列,使用该索引来对lists进行子集化并减去第4列。

lst <- lapply(seq_along(BASE), function(i) BASE[[i]][,4]-FUTURE[[i]][,4])
do.call(cbind, lst) 

数据

set.seed(24)
BASE <- lapply(1:4, function(i) 
            as.data.frame(matrix(sample(0:9, 5*10, replace=TRUE), ncol=5)))
set.seed(48)
FUTURE <- lapply(1:4, function(i) 
    as.data.frame(matrix(sample(0:9, 5*10, replace=TRUE), ncol=5)))

答案 1 :(得分:1)

为了进一步发表上述评论,我需要一个班轮将名单相互映射

do.call(cbind, purrr::map2(BASE, FUTURE, ~ .x[, 4] - .y[, 4]))