基本上,我有一個包含許多不同變數的大型資料集。資料是成對排列的(2019 年和 2020 年),對于某些變數而言,這兩個年份的資料僅適用于 2019 年和某些僅適用于 2020 年的資料。我希望 2020 年的資料能夠“覆寫”2019 年的資料,但前提是它可用在 2020 年和 2019 年。如果任何一年都沒有可用的資料,那么資料應該保持缺失。我現在用一個小輔助函式來做到這一點,但這應該更具可擴展性,這樣我就可以為 200 多個列對做到這一點。我錯過了什么mutate(across(....),)
# Create data
mydf <- tibble(ID = 1:5,
var1_2019 = c(9, NA, 3, 2, NA),
var1_2020 = c(NA, NA, 3, 2, 4),
var2_2019 = c("A", "B",NA, "D", "C"),
var2_2020 = c(NA, "B",NA, "R", NA),
var3_2019 = c(T, F, NA, NA, NA),
var3_2020 = c(NA, NA, NA, NA, F))
# create little helper function. this is good because
# it could be made more complex in the future,
# for example for numeric variables keeping the larger of the two
which_to_keep_f <-
function(x, y) {
if (is.na(x) && is.na(y)) {
output <- NA
}
if (is.na(x) && !is.na(y)) {
output <- y
}
if (!is.na(x) && is.na(y)) {
output <- x
}
if (!is.na(x) && !is.na(y)) {
output <- y
}
output
}
# vectorize it
which_to_keep_f_vec <- Vectorize(which_to_keep_f)
# use function inside mutate
mydf %>%
mutate(var1 = which_to_keep_f_vec(var1_2019, var1_2020)) %>%
mutate(var2 = which_to_keep_f_vec(var2_2019, var2_2020)) %>%
mutate(var3 = which_to_keep_f_vec(var3_2019, var3_2020)) %>%
select(-contains("_20"))
uj5u.com熱心網友回復:
更新:感謝 micahkimel 洗掉list不重復資料:
這是你想要的。在這里,我們將您的函式應用于成對集:
library(dplyr)
library(stringr)
mydf %>%
mutate(across(ends_with('_2019'),
~(which_to_keep_f_vec(.,
get(str_replace(cur_column(), "_2019$", "_2020"))))) %>%
unnest(cols=c())
ID var1_2019 var1_2020 var2_2019 var2_2020 var3_2019 var3_2020
<int> <dbl> <dbl> <chr> <chr> <lgl> <lgl>
1 1 9 NA A NA TRUE NA
2 2 NA NA B B FALSE NA
3 3 3 3 NA NA NA NA
4 4 2 2 R R NA NA
5 5 4 4 C NA FALSE FALSE
uj5u.com熱心網友回復:
這是一種方法,它只為輸入表中的每對變數生成一個變數。首先,使用pivot_longer()將這些對折疊成單個變數,并添加year為一列(具有兩倍的觀察值)。
mydf_long = mydf %>%
pivot_longer(cols = matches("_20"), names_to = c(".value", "year"),
names_sep = "_")
ID year var1 var2 var3
<int> <chr> <dbl> <chr> <lgl>
1 1 2019 9 A TRUE
2 1 2020 NA NA NA
3 2 2019 NA B FALSE
4 2 2020 NA B NA
5 3 2019 3 NA NA
6 3 2020 3 NA NA
7 4 2019 2 D NA
8 4 2020 2 R NA
9 5 2019 NA C NA
10 5 2020 4 NA FALSE
接下來,使用fill()較早的非缺失值填充較晚的 NA 值。然后我們可以過濾到最近的一年(2020 年)。對于每個變數,如果之前有一個值,那一年將有自己的值;否則,它將結轉上一年的價值。
mydf_long %>%
group_by(ID) %>%
fill(var1, var2, var3) %>%
filter(year == 2020)
ID year var1 var2 var3
<int> <chr> <dbl> <chr> <lgl>
1 1 2020 9 A TRUE
2 2 2020 NA B FALSE
3 3 2020 3 NA NA
4 4 2020 2 R NA
5 5 2020 4 C FALSE
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/404919.html
標籤:
上一篇:每個方面一個功能
