Пропускать столбцы вместо того, чтобы бросать их в мурлыканье - PullRequest
3 голосов
/ 06 июня 2019

Мне нужно рассчитать индекс для нескольких списков.Тем не менее, я могу сделать это только в том случае, если я опущу некоторые столбцы (здесь они обозначены буквой "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 ]

2 голосов
/ 06 июня 2019

Вместо отбрасывания столбцов вы можете выбрать столбцы, для которых вы хотите взять сумму.

Вы можете выбрать по имени

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])))
0 голосов
/ 06 июня 2019

Вот подход 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...