我有一個如下所示的資料框:
x <- tibble(id = c(1,1,1,2,2,2),
val = c(1,3,5,7,9,11)
)
我想要group_by每個id,然后將val每個組中所有s的串列/向量應用于該組的每個成員。結果將是如下所示的資料框。
x_out <- tibble(id = c(1,1,1,2,2,2),
val = c(1,3,5,7,9,11),
group_vals = list(c(1,3,5),c(1,3,5),c(1,3,5),
c(7,9,11),c(7,9,11),c(7,9,11))
)
我該怎么做,因為函式summarize只為整個組回傳一個值?
uj5u.com熱心網友回復:
out <- x %>%
group_by(id) %>%
mutate(group_vals = list(val)) %>%
ungroup()
out
# # A tibble: 6 x 3
# id val group_vals
# <dbl> <dbl> <list>
# 1 1 1 <dbl [3]>
# 2 1 3 <dbl [3]>
# 3 1 5 <dbl [3]>
# 4 2 7 <dbl [3]>
# 5 2 9 <dbl [3]>
# 6 2 11 <dbl [3]>
我們可以看到它的group_vals樣子:
str(out)
# tibble [6 x 3] (S3: tbl_df/tbl/data.frame)
# $ id : num [1:6] 1 1 1 2 2 2
# $ val : num [1:6] 1 3 5 7 9 11
# $ group_vals:List of 6
# ..$ : num [1:3] 1 3 5
# ..$ : num [1:3] 1 3 5
# ..$ : num [1:3] 1 3 5
# ..$ : num [1:3] 7 9 11
# ..$ : num [1:3] 7 9 11
# ..$ : num [1:3] 7 9 11
驗證,使用您x_out上面的定義:
identical(out, tibble(id = c(1,1,1,2,2,2),
val = c(1,3,5,7,9,11),
group_vals = list(c(1,3,5),c(1,3,5),c(1,3,5),
c(7,9,11),c(7,9,11),c(7,9,11))
))
# [1] TRUE
uj5u.com熱心網友回復:
另一種選擇,使用 left_join 和 nest
library(tidyverse)
left_join(x, nest(x, group_vals = val), by = "id")
#> # A tibble: 6 × 3
#> id val group_vals
#> <dbl> <dbl> <list>
#> 1 1 1 <tibble [3 × 1]>
#> 2 1 3 <tibble [3 × 1]>
#> 3 1 5 <tibble [3 × 1]>
#> 4 2 7 <tibble [3 × 1]>
#> 5 2 9 <tibble [3 × 1]>
#> 6 2 11 <tibble [3 × 1]>
uj5u.com熱心網友回復:
一個data.table選項
> setDT(x)[, group_vals := .(list(val)), id][]
id val group_vals
1: 1 1 1,3,5
2: 1 3 1,3,5
3: 1 5 1,3,5
4: 2 7 7, 9,11
5: 2 9 7, 9,11
6: 2 11 7, 9,11
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/389585.html
