在 r dplyr select 中按组进行第一次观察并创建一个列表
in r dplyr select the first observation by group and create a list
我想select将第一个观察分组并创建一个列表列。
例如:
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)))
但是出错了。
可能的解决方案:
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(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
您可以使用 slice
作为 -
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]>
As slice
returns a dataframe/tibble 它作为列表保存在 L
列中。
我想select将第一个观察分组并创建一个列表列。
例如:
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)))
但是出错了。
可能的解决方案:
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(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
您可以使用 slice
作为 -
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]>
As slice
returns a dataframe/tibble 它作为列表保存在 L
列中。