我试图从另一个列表中的所有文件中减去一个列表中包含的所有文件。我在两个列表中都有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
关于如何解决这个问题的任何想法?
答案 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使用了lapply
,lapply
的一种方法是遍历其中一个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]))