列(垂直)列表的总和列表

时间:2018-02-06 09:17:27

标签: r

就像数据帧中的列和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

6 个答案:

答案 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的答案类似,但使用包中的reduce函数和包中的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

还有其他选项,例如lapplyvapply等。只有我们需要调整上述内容才能将其转换为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