в r dplyr выберите первое наблюдение по группе и создайте список
Я хотел бы выбрать первое наблюдение в группе и создать столбец списка.
Например:
df <- structure(list(Grp = c("A", "A", "A", "B", "B"), col1 = c(1,
2, 3, 70, 80), col2 = c(4, 5, 6, 100, 110)), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -5L))
Я хотел бы создать столбец, первым элементом которого является c (1,4), а вторым элементом является c (70, 100).
Я пытался:
df %>% group_by(Grp) %>% mutate(L = list(slice(1)))
Но получил ошибку.
3 ответа
Возможное решение:
library(dplyr)
df %>%
group_by(Grp) %>% mutate(L = list(c(first(col1), first(col2)))) %>%
ungroup
#> # A tibble: 5 × 4
#> Grp col1 col2 L
#> <chr> <dbl> <dbl> <list>
#> 1 A 1 4 <dbl [2]>
#> 2 A 2 5 <dbl [2]>
#> 3 A 3 6 <dbl [2]>
#> 4 B 70 100 <dbl [2]>
#> 5 B 80 110 <dbl [2]>
Вы можете использовать как -
library(dplyr)
df %>%
group_by(Grp) %>%
mutate(L = list(slice(cur_data(), 1))) %>%
ungroup
# Grp col1 col2 L
# <chr> <dbl> <dbl> <list>
#1 A 1 4 <tibble [1 × 2]>
#2 A 2 5 <tibble [1 × 2]>
#3 A 3 6 <tibble [1 × 2]>
#4 B 70 100 <tibble [1 × 2]>
#5 B 80 110 <tibble [1 × 2]>
В качестве
slice
возвращает кадр данных/тиббл, в котором он сохраняется
L
столбец как список.
Мы могли бы использовать индекс:
library(dplyr)
df %>%
group_by(Grp) %>%
mutate(New_col = list(c(col1[1], col2[1]))) %>%
ungroup()
Grp col1 col2 New_col
<chr> <dbl> <dbl> <list>
1 A 1 4 <dbl [2]>
2 A 2 5 <dbl [2]>
3 A 3 6 <dbl [2]>
4 B 70 100 <dbl [2]>
5 B 80 110 <dbl [2]>
Или, может быть:
df %>%
group_by(Grp) %>%
mutate(New_col = toString(c(col1[1], col2[1]))) %>%
ungroup()
Grp col1 col2 New_col
<chr> <dbl> <dbl> <chr>
1 A 1 4 1, 4
2 A 2 5 1, 4
3 A 3 6 1, 4
4 B 70 100 70, 100
5 B 80 110 70, 100