我有一個包含“潛在”列名稱的向量:
col_vector <- c("A", "B", "C")
我也有一個資料框,例如
library(tidyverse)
df <- tibble(A = 1:2,
B = 1:2)
現在我的目標是創建中提到的所有列col_vector那還不存在的df。
對于上面的例子,我下面的代碼有效:
df %>%
mutate(!!sym(setdiff(col_vector, colnames(.))) := NA)
# A tibble: 2 x 3
A B C
<int> <int> <lgl>
1 1 1 NA
2 2 2 NA
問題是此代碼會在 a)col_vector缺少一列以上或 b) 沒有col_vector缺少任何列時失敗。我想過某種 if_else,但不知道如何以這種方式使列創建成為條件 - 最好以 tidyverse 方式。我知道我可以創建一個遍歷所有缺失列的回圈,但我想知道是否有更直接的方法。
上面代碼失敗的示例資料:
df2 <- tibble(A = 1:2)
df3 <- tibble(A = 1:2,
B = 1:2,
C = 1:2)
uj5u.com熱心網友回復:
這應該有效。
df[,setdiff(col_vector, colnames(df))] <- NA
uj5u.com熱心網友回復:
解決方案
此base解決方案可能比dplyr作業流程更簡單:
library(tidyverse)
# ...
# Code to generate 'df'.
# ...
# Find the subset of missing names, and create them as columns filled with 'NA'.
df[, setdiff(col_vector, names(df))] <- NA
# View results
df
結果
鑒于您的樣本col_vector和df這里
col_vector <- c("A", "B", "C")
df <- tibble(A = 1:2, B = 1:2)
此解決方案應產生以下結果:
# A tibble: 2 x 3
A B C
<int> <int> <lgl>
1 1 1 NA
2 2 2 NA
好處
我的解決方案的一個優點是,與上面由@geoff鏈接的替代方案相比,您不需要在作業流中手動編碼列名稱集,如s 和字串。symboldplyr
df %>% mutate(
#####################################
A = ifelse("A" %in% names(.), A, NA),
B = ifelse("B" %in% names(.), B, NA),
C = ifelse("C" %in% names(.), B, NA)
# ...
# etc.
#####################################
)
相比之下,我的解決方案更具活力
##############################
df[, setdiff(col_vector, names(df))] <- NA
##############################
如果你決定要改變(甚至是動態計算!)你的變數名中游,因為它決定了setdiff()在運行時。
筆記
令人難以置信的是,@AustinGraves 發布他們的答案在精確的同一時間(2021-10-25 21:03:05Z)作為我貼我的,所以兩個答案有資格作為原來的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336897.html
