省略列而不是将它们放在purrr中

时间:2019-06-06 09:52:28

标签: r dplyr tidyverse purrr

我需要计算多个列表的索引。但是,只有删除一些列(此处用“ w”和“ x”表示)时,我才能执行此操作。例如。

library(tidyverse)
lists<- list(
  l1=tribble(
  ~w, ~x, ~y, ~z,
  #--|--|--|----
  12, "a", 2, 1,
  12, "a",5, 3,
  12, "a",6, 2),

  l2=tribble(
    ~w, ~x, ~y, ~z,
    #--|--|--|----
    13,"b", 5, 7,
    13,"b", 4, 6,
    13,"b", 3, 2)) 
lists %>% 
  map(~ .x %>%  
        #group_by(w,x) %>% 
        select(-w,-x) %>%  
        mutate(row_sums = rowSums(.)))

我不想删除那些列,而是希望保留/忽略它们,只计算“ y”和“ z”的索引。

我设法做到这一点,首先提取那些列,然后再绑定它们。例如。

select.col<-lists %>% 
  map_dfr(~ .x %>% 
            select(w,x))

lists %>% 
  map_dfr(~ .x %>%  
        select(-w,-x) %>%  
        mutate(row_sums = rowSums(.))) %>% 
        bind_cols(select.col)

但是,这不是很优雅,我不得不绑定列表(map_dfr),但是我想将它们保留为列表。

可能的另一种方法是使用select_if(., is.numeric),但是由于我需要省略一些数字列,因此我不确定这是否是最佳选择。

我敢肯定有一个解决此问题的简单方法。有人可以看看吗?

2 个答案:

答案 0 :(得分:2)

您可以选择要加和的列,而不必删除列。

您可以按名称选择

library(dplyr)
library(purrr)

lists %>% map(~ .x %>% mutate(row_sums = rowSums(.[c("y", "z")])))


#$l1
# A tibble: 3 x 5
#      w x         y     z row_sums
#  <dbl> <chr> <dbl> <dbl>    <dbl>
#1    12 a         2     1        3
#2    12 a         5     3        8
#3    12 a         6     2        8

#$l2
# A tibble: 3 x 5
#      w x         y     z row_sums
#  <dbl> <chr> <dbl> <dbl>    <dbl>
#1    13 b         5     7       12
#2    13 b         4     6       10
#3    13 b         3     2        5

或者也可以通过列的位置

lists %>% map(~ .x %>%  mutate(row_sums = rowSums(.[3:4])))

答案 1 :(得分:0)

这里是一种tidyverse方法来获取行总和

library(tidyverse)
lists %>% 
    map(~ .x %>%
            mutate(row_sums = select(., y:z) %>% 
                   reduce(`+`)))
#$l1
# A tibble: 3 x 5
#      w x         y     z row_sums
#  <dbl> <chr> <dbl> <dbl>    <dbl>
#1    12 a         2     1        3
#2    12 a         5     3        8
#3    12 a         6     2        8

#$l2
# A tibble: 3 x 5
#      w x         y     z row_sums
#  <dbl> <chr> <dbl> <dbl>    <dbl>
#1    13 b         5     7       12
#2    13 b         4     6       10
#3    13 b         3     2        5

或使用base R

lapply(lists, transform, row_sums = y + z)