就像数据帧中的列和X1 $ value + X2 $值一样,我想在列表列表中尽可能少地使用R代码而不是使用for-loop。感谢。
输入:
n1 <- c(1,2,3)
n2 <- c(2,3,4)
df1 <- data.frame(n1,n2)
n1 <- c(3,2,1)
n2 <- c(5,5,6)
df2 <- data.frame(n1,n2)
mylist <- list(df1, df2)
n0 <- c(0,0,0) #init compute
compute <- data.frame(n0)
for(i in 1:length(mylist)){
compute[,1] <- mylist[[i]]$n1 + compute[,1]
}
期望的输出:
>compute
n0
1 4
2 4
3 4
答案 0 :(得分:8)
您可以使用Reduce
执行此操作并选择所需的列,即
Reduce(`+`, mylist)
#Reduce(`+`, mylist)['n1'] <-- This will extract the n1 column
给出,
n1 n2 1 4 7 2 4 8 3 4 10
答案 1 :(得分:2)
与Sotos的答案类似,但使用purrr包中的reduce
函数和dplyr包中的select
函数来准备compute
数据帧。
library(tidyverse)
compute <- reduce(mylist, `+`) %>% select(n0 = n1)
compute
# n0
# 1 4
# 2 4
# 3 4
答案 2 :(得分:2)
就像我们对 dataframes 所做的那样,如果列表被命名,我们可以使用$
:
# named list
mylist <- list(df1 = df1, df2 = df2)
# add columns
mylist$df1$n1 + mylist$df2$n1
# [1] 4 4 4
如果列表未命名:
mylist[[1]][1] + mylist[[2]][1]
答案 3 :(得分:1)
使用sapply
提取列'n1'并执行rowSums
data.frame(n0 = rowSums(sapply(mylist, `[[`, 'n1')))
# n0
#1 4
#2 4
#3 4
还有其他选项,例如lapply
,vapply
等。只有我们需要调整上述内容才能将其转换为data.frame
。
rowSums(data.frame(lapply(mylist, `[[`, 'n1')))
或tidyverse
library(tidyverse)
mylist %>%
map(~ .x %>%
select(n1)) %>%
bind_cols %>%
rowSums
或其他选项是
mylist %>%
map( ~ .x %>%
select(n1)) %>%
reduce(`+`)
答案 4 :(得分:1)
试试这个:
compute<-data.frame(n0=rowSums(do.call(cbind, lapply(mylist, `[[`, 1))))
compute
n0
1 4
2 4
3 4
答案 5 :(得分:1)
purrr:transpose
library(dplyr)
library(purrr)
mylist %>%
purrr::transpose() %>%
purrr::map(as.data.frame) %>%
`[[`("n1") %>%
rowSums %>%
data.frame(n0 = .)
# n0
# 1 4
# 2 4
# 3 4