gpt4 book ai didi

R 使用 groupby 将行添加到数据帧

转载 作者:行者123 更新时间:2023-12-04 08:29:02 25 4
gpt4 key购买 nike

新 R 用户在这里。我有一个看起来像这样的数据框:

│   │ uID │ day│ status │
├───┼─────┼────┼────────┤
│ │ A │ 5 │ 1 │
│ │ B │ 4 │ 1 │
│ │ C │ 9 │ 1 │
我想向该表添加新行,以便每个 uID 从 1 到 [[day]] 的所有天都有一行。此外,在 [[day]] 之前的所有日子里,每个 uID 的状态都将为 0。
例如:
│   │ uID │ day │ status │
├───┼─────┼─────┼────────┤
│ │ A │ 1 │ 0 │
│ │ A │ 2 │ 0 │
│ │ A │ 3 │ 0 │
│ │ A │ 4 │ 0 │
│ │ A │ 5 │ 1 │
│ │ B │ 1 │ 0 │
│ │ B │ 2 │ 0 │
│ │ B │ 3 │ 0 │
│ │ B │ 4 │ 1 │

对于某些 for 循环,肯定有一种丑陋的方法可以做到这一点,但我想知道是否有更优雅的方法来做到这一点,例如 groupby?
谢谢!

最佳答案

我们可以使用 group_by 'uID' 和 summarise创建列“状态”和“天”。与 dplyr版本>= 1.0 , summarise没有限制每组只返回一行

library(dplyr)
df1 %>%
group_by(uID) %>%
summarise(status = rep(c(0, 1), c(day-1, 1)),
day = seq(day), .groups = 'drop') %>%
select(names(df1))
-输出
# A tibble: 18 x 3
# uID day status
# <chr> <int> <dbl>
# 1 A 1 0
# 2 A 2 0
# 3 A 3 0
# 4 A 4 0
# 5 A 5 1
# 6 B 1 0
# 7 B 2 0
# 8 B 3 0
# 9 B 4 1
#10 C 1 0
#11 C 2 0
#12 C 3 0
#13 C 4 0
#14 C 5 0
#15 C 6 0
#16 C 7 0
#17 C 8 0
#18 C 9 1

或者另一种选择是
library(tidyr)
library(purrr)
df1 %>%
mutate(day = map(day, seq)) %>%
unnest(c(day)) %>%
group_by(uID) %>%
mutate(status = +(row_number() == n()))
数据
df1 <- structure(list(uID = c("A", "B", "C"), day = c(5, 4, 9), status = c(1, 
1, 1)), class = "data.frame", row.names = c(NA, -3L))

关于R 使用 groupby 将行添加到数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65115686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com