我在 R 中有一個志愿服務資料框。我希望志愿服務的每個財政年度都有一行。所以我的資料是這樣的:
ID Volunteership FYStart FYEnd
1 Fabulousness 2019 2021
2 Graciousness 2021 2021
3 Loveliness 1995 1999
我需要為所涉及的每個財政年度添加一個新行,并且需要一個標記每個的“VolFY”列。我需要結束:
ID Volunteership FYStart FYEnd VolFY
1 Fabulousness 2019 2021 2019
1 Fabulousness 2019 2021 2020
1 Fabulousness 2019 2021 2021
2 Graciousness 2021 2021 2021
3 Loveliness 1995 1999 1995
3 Loveliness 1995 1999 1996
3 Loveliness 1995 1999 1997
3 Loveliness 1995 1999 1998
3 Loveliness 1995 1999 1999
到目前為止,我已經玩過seq()和rep()。我也玩過一個for回圈和一個while回圈,但還沒有完全掌握確切的技巧。
如果你做過這種事情,請分享你是如何做到的。這是一個難題。
——瑪麗安
uj5u.com熱心網友回復:
這是一種方法tidyverse-
library(tidyverse)
df %>%
mutate(VolFY = map2(FYStart, FYEnd, seq)) %>%
unnest(VolFY)
# ID Volunteership FYStart FYEnd VolFY
# <int> <chr> <int> <int> <int>
#1 1 Fabulousness 2019 2021 2019
#2 1 Fabulousness 2019 2021 2020
#3 1 Fabulousness 2019 2021 2021
#4 2 Graciousness 2021 2021 2021
#5 3 Loveliness 1995 1999 1995
#6 3 Loveliness 1995 1999 1996
#7 3 Loveliness 1995 1999 1997
#8 3 Loveliness 1995 1999 1998
#9 3 Loveliness 1995 1999 1999
uj5u.com熱心網友回復:
試試這個:
newdat <- do.call(rbind, Map(function(ID, S, E) data.frame(ID=ID, VolFY=seq(S, E)), dat$ID, dat$FYStart, dat$FYEnd))
merge(dat, newdat, by = "ID")
# ID Volunteership FYStart FYEnd VolFY
# 1 1 Fabulousness 2019 2021 2019
# 2 1 Fabulousness 2019 2021 2020
# 3 1 Fabulousness 2019 2021 2021
# 4 2 Graciousness 2021 2021 2021
# 5 3 Loveliness 1995 1999 1995
# 6 3 Loveliness 1995 1999 1996
# 7 3 Loveliness 1995 1999 1997
# 8 3 Loveliness 1995 1999 1998
# 9 3 Loveliness 1995 1999 1999
這是有效的,因為我們首先迭代每一行并生成一個新年份的迷你框架(在merge回傳原始資料之前):
Map(function(ID, S, E) data.frame(ID=ID, VolFY=seq(S, E)), dat$ID, dat$FYStart, dat$FYEnd)
# [[1]]
# ID VolFY
# 1 1 2019
# 2 1 2020
# 3 1 2021
# [[2]]
# ID VolFY
# 1 2 2021
# [[3]]
# ID VolFY
# 1 3 1995
# 2 3 1996
# 3 3 1997
# 4 3 1998
# 5 3 1999
資料
dat <- structure(list(ID = 1:3, Volunteership = c("Fabulousness", "Graciousness", "Loveliness"), FYStart = c(2019L, 2021L, 1995L), FYEnd = c(2021L, 2021L, 1999L)), class = "data.frame", row.names = c(NA, -3L))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/396680.html
下一篇:函式需要一個回圈解決方案
