I have a tibble structured like this:
df <-
tibble(
x = 1:3,
light_93 = list(1:3, 5:7, 18:20),
light_94 = list(3:5, 9:11, 18:20),
light_95 = list(5:7, 44:46, 30:32))
I want to make multiple new columns, giving the mean of each light_
column-list. So I want this result:
out <-
df %>%
mutate(light_93_mean = map_dbl(light_93, mean),
light_94_mean = map_dbl(light_94, mean),
light_95_mean = map_dbl(light_95, mean))
Can I use mutate_at
to automate this? (I have hundreds of list-columns.) I can't figure out how to make it work in a tibble.
Specify the columns to apply in vars
argument in mutate_at
, then in each column loop over the list
with map
and get the mean
library(dplyr)
library(purrr)
df %>%
mutate_at(vars(starts_with('light')),
list(mean = ~ map_dbl(., mean)))
# A tibble: 3 x 7
# x light_93 light_94 light_95 light_93_mean light_94_mean light_95_mean
# <int> <list> <list> <list> <dbl> <dbl> <dbl>
#1 1 <int [3]> <int [3]> <int [3]> 2 4 6
#2 2 <int [3]> <int [3]> <int [3]> 6 10 45
#3 3 <int [3]> <int [3]> <int [3]> 19 19 31
Or using the devel
version with across
and mutate
df %>%
mutate(across(starts_with('light'), ~ map_dbl(., mean), names = "{col}_mean"))
# A tibble: 3 x 7
# x light_93 light_94 light_95 light_93_mean light_94_mean light_95_mean
# <int> <list> <list> <list> <dbl> <dbl> <dbl>
#1 1 <int [3]> <int [3]> <int [3]> 2 4 6
#2 2 <int [3]> <int [3]> <int [3]> 6 10 45
#3 3 <int [3]> <int [3]> <int [3]> 19 19 31
It is also possible to have different sets of columns with different functions applied
df %>%
mutate(across(starts_with('light'), ~ map_dbl(., mean), names = "{col}_mean"),
across(matches('(94|95)$'), ~ map_dbl(., sum), names = "{col}_sum"))
# A tibble: 3 x 9
# x light_93 light_94 light_95 light_93_mean light_94_mean light_95_mean light_94_sum light_95_sum
# <int> <list> <list> <list> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 <int [3]> <int [3]> <int [3]> 2 4 6 12 18
#2 2 <int [3]> <int [3]> <int [3]> 6 10 45 30 135
#3 3 <int [3]> <int [3]> <int [3]> 19 19 31 57 93
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다