我需要计算多个列表的索引。但是,只有删除一些列(此处用“ 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)
,但是由于我需要省略一些数字列,因此我不确定这是否是最佳选择。
我敢肯定有一个解决此问题的简单方法。有人可以看看吗?
答案 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)