我有一个由data.frames组成的列表:
> list1
$HSP90AB1
lineNum count
HSP90AB1 1 1
INMT 2 0
CKB 3 0
NR2E1 4 1
ME3 5 0
FAM162A 6 0
KIRREL2 7 0
$INMT
lineNum count
HSP90AB1 1 1
INMT 2 0
CKB 3 0
NR2E1 4 0
ME3 5 0
FAM162A 6 0
KIRREL2 7 1
$CKB
lineNum count
HSP90AB1 1 1
INMT 2 0
CKB 3 0
NR2E1 4 0
ME3 5 1
FAM162A 6 0
KIRREL2 7 0
$NR2E1
lineNum count
HSP90AB1 1 0
INMT 2 0
CKB 3 0
NR2E1 4 0
ME3 5 0
FAM162A 6 0
KIRREL2 7 0
$ME3
lineNum count
HSP90AB1 1 0
INMT 2 1
CKB 3 0
NR2E1 4 0
ME3 5 0
FAM162A 6 0
KIRREL2 7 0
$FAM162A
lineNum count
HSP90AB1 1 1
INMT 2 0
CKB 3 0
NR2E1 4 0
ME3 5 0
FAM162A 6 0
KIRREL2 7 0
$KIRREL2
lineNum count
HSP90AB1 1 0
INMT 2 0
CKB 3 0
NR2E1 4 0
ME3 5 0
FAM162A 6 0
KIRREL2 7 0
我想获得以下结果:首先,对列表中每个元素1
的列中count
的总和进行累加,然后1
对元素的其余元素中该元素的名称具有a的次数求和。例如list1[[2]]
($ INMT)的列表,第一步将是:2(1
该count
列中有两个),第二步将是:1(中有一个1
对应INMT
于$ME3
)。列表的一部分通过使用指出了我的意思,Reduce
但是如果我这样做:
Reduce('+', list1)
lineNum count
HSP90AB1 7 4
INMT 14 1
CKB 21 0
NR2E1 28 1
ME3 35 1
FAM162A 42 0
KIRREL2 49 1
我只从寻找的东西中得到第二步,有什么想法吗?
谢谢
PS还有一个重要的问题要解决,第一步只应计算与名称不匹配的元素,在我的示例中,第一步中仅对$HSP90AB1
(list1[[1]]
)进行1
对应,NR2E1
因为另一个1
对应于HSP90AB1
哪个匹配的名称list1[[1]]
。
所需的输出如下:
HSP90AB1 4
INMT 3
CKB 2
NR2E1 1
ME3 2
FAM162A 1
KIRREL2 1
这是dput(list1)
:
structure(list(HSP90AB1 = structure(list(lineNum = 1:7, count = c(1L, 0L, 0L, 1L, 0L, 0L, 0L)),
.Names = c("lineNum", "count"), row.names = c("HSP90AB1","INMT", "CKB", "NR2E1", "ME3","FAM162A", "KIRREL2"), class = "data.frame"),
INMT = structure(list(lineNum = 1:7, count = c(1L, 0L, 0L,
0L, 0L, 0L, 1L)), .Names = c("lineNum", "count"), row.names = c("HSP90AB1",
"INMT", "CKB", "NR2E1", "ME3", "FAM162A", "KIRREL2"), class = "data.frame"),
CKB = structure(list(lineNum = 1:7, count = c(1L, 0L, 0L,
0L, 1L, 0L, 0L)), .Names = c("lineNum", "count"), row.names = c("HSP90AB1",
"INMT", "CKB", "NR2E1", "ME3", "FAM162A", "KIRREL2"), class = "data.frame"),
NR2E1 = structure(list(lineNum = 1:7, count = c(0L, 0L, 0L,
0L, 0L, 0L, 0L)), .Names = c("lineNum", "count"), row.names = c("HSP90AB1",
"INMT", "CKB", "NR2E1", "ME3", "FAM162A", "KIRREL2"), class = "data.frame"),
ME3 = structure(list(lineNum = 1:7, count = c(0L, 1L, 0L,
0L, 0L, 0L, 0L)), .Names = c("lineNum", "count"), row.names = c("HSP90AB1",
"INMT", "CKB", "NR2E1", "ME3", "FAM162A", "KIRREL2"), class = "data.frame"),
FAM162A = structure(list(lineNum = 1:7, count = c(1L, 0L,
0L, 0L, 0L, 0L, 0L)), .Names = c("lineNum", "count"), row.names = c("HSP90AB1",
"INMT", "CKB", "NR2E1", "ME3", "FAM162A", "KIRREL2"), class = "data.frame"),
KIRREL2 = structure(list(lineNum = 1:7, count = c(0L, 0L,
0L, 0L, 0L, 0L, 0L)), .Names = c("lineNum", "count"), row.names = c("HSP90AB1",
"INMT", "CKB", "NR2E1", "ME3", "FAM162A", "KIRREL2"), class = "data.frame")), .Names = c("HSP90AB1", "INMT", "CKB", "NR2E1", "ME3", "FAM162A", "KIRREL2"))
这应该做。重要的步骤是通过将每个列表元素的不需要项归零来修改列表:
list2 <- Map(function(x, exclude) {x[exclude, "count"] <- 0; x},
list1, names(list1))
然后,您可以执行以下操作:
count1 <- sapply(list2, with, sum(count))
count2 <- Reduce(`+`, list2)$count
count1 + count2
# HSP90AB1 INMT CKB NR2E1 ME3 FAM162A KIRREL2
# 4 3 2 1 2 1 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句