dplyr 中是否有一種直接的方法可以通過復制基于特定向量的行來擴展資料幀?
例如,我有以下資料框:
df <- tibble(Year=c(2019),
cat1=c("A","B"),
cat2=c("X","Y"),
value1=c(1,2),
value2=c(10,20))
selected_years <- c(2019:2021)
我想復制cat1=="A"2019-2021 年的行。某些列 (value1, cat) 的值應取自原始年份 2019,其他一些列 (value2) 用 NA 填充。
最終輸出應如下所示:
Year cat value1 value2
2019 A 1 10
2020 A 1 NA
2021 A 1 NA
2019 B 2 20
我試過bind_rows()......但是,結果并不完全是我想要的(我只得到“A”-部分而不是“B”-部分),我不確定這是否真的是最直觀的/dplyr方式去,或者如果另一種方法(甚至特定功能)更合理:
df%>%
filter(cat1=="A",Year==2019)%>%
bind_rows(
data.frame(
Year=setdiff(selected_years,.$Year),
cat1=.$cat1,
value1=.$value1
)
)
)
編輯:
我也嘗試使用expandand right_join,但我想要的列值不會重復:
df %>%
dplyr::right_join(df %>%
filter(cat1=="A",Year==2019)%>%
expand(Year=c(2019:2021)))
也許涉及的方法case_when?
uj5u.com熱心網友回復:
您只想保留特定值而其他人不想保留的部分使這變得棘手。使用和 中的條件很容易擴展所有值的向量。在最后一步中,我們只是重置了我們不想復制的值。如果您要設定多個值,我們可以使用.rowwiseunnestif_elseNANAacross
library(tidyverse)
df <- tibble(Year=c(2019),
cat1=c("A","B"),
cat2=c("X","Y"),
value1=c(1,2),
value2=c(10,20))
selected_years <- c(2019:2021)
df %>%
rowwise %>%
mutate(Year = if_else(cat1 == "A", list(selected_years), list(Year))) %>%
unnest(Year) %>%
mutate(value2 = if_else(Year != 2019, NA_real_, value2))
#> # A tibble: 4 x 5
#> Year cat1 cat2 value1 value2
#> <dbl> <chr> <chr> <dbl> <dbl>
#> 1 2019 A X 1 10
#> 2 2020 A X 1 NA
#> 3 2021 A X 1 NA
#> 4 2019 B Y 2 20
由reprex 包(v2.0.1)于 2021 年 12 月 8 日創建
或者我們可以創建一個df2和full_join它df:
library(dplyr)
df2 <- tibble(Year = selected_years,
cat1 = "A",
cat2 = "X",
value1 = 1)
df %>%
full_join(df2, by = c("Year", "cat1", "cat2", "value1"))
#> # A tibble: 4 x 5
#> Year cat1 cat2 value1 value2
#> <dbl> <chr> <chr> <dbl> <dbl>
#> 1 2019 A X 1 10
#> 2 2019 B Y 2 20
#> 3 2020 A X 1 NA
#> 4 2021 A X 1 NA
由reprex 包(v2.0.1)于 2021 年 12 月 8 日創建
uj5u.com熱心網友回復:
library(tidyverse)
tibble(selected_years) %>%
mutate(cat1 = "A") %>%
full_join(df, by = "cat1") %>%
mutate(selected_years = ifelse(is.na(selected_years), Year, selected_years)) %>%
group_by(cat1) %>%
mutate(value2 = ifelse(row_number() != 1, NA, value2)) %>%
ungroup() %>%
select(Year = selected_years, cat = cat1, value1, value2)
Year cat value1 value2
<dbl> <chr> <dbl> <dbl>
1 2019 A 1 10
2 2020 A 1 NA
3 2021 A 1 NA
4 2019 B 2 20
uj5u.com熱心網友回復:
基于的解決方案dplyr::bind_rows:
library(tidyverse)
df <- tibble(Year=c(2019),
cat1=c("A","B"),
cat2=c("X","Y"),
value1=c(1,2),
value2=c(10,20))
selected_years <- c(2020:2021)
df %>%
bind_rows(data.frame(
Year=selected_years, filter(., cat1 == "A") %>% select(-Year, -value2))) %>%
arrange(cat1)
#> # A tibble: 4 × 5
#> Year cat1 cat2 value1 value2
#> <dbl> <chr> <chr> <dbl> <dbl>
#> 1 2019 A X 1 10
#> 2 2020 A X 1 NA
#> 3 2021 A X 1 NA
#> 4 2019 B Y 2 20
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/376497.html
上一篇:如何洗掉資料框中的“最小值”和“最大值”并計算“R”中的平均值
下一篇:獲取R中嵌套串列最深層的名稱
