![](/img/trans.png)
[英]combine mutate(across) and case_when to fill multiple columns with 0 depending on condition
[英]How to combine the across () function with mutate () and case_when () to mutate values in multiple columns according to a condition?
我有人口統計數據集,其中包括家庭成員的年齡。 這是通過調查收集的,參與者可以拒絕提供他們的年齡。
結果是一個數據集,每行一個家庭(每個家庭都有一個家庭 ID 代碼),列中有各種家庭特征,例如年齡。 拒絕響應編碼為“R”,您可以使用以下代碼重新創建示例:
df <- list(Household_ID = c("1A", "1B", "1C", "1D", "1E"),
AGE1 = c("25", "47", "39", "50", "R"),
AGE2 = c("66", "23", "71", "R", "16"),
AGE3 = c("28", "17", "R", "R", "80"),
AGE4 = c("81", "22", "48", "59", "R"))
df <- as_tibble(df)
> df
# A tibble: 5 x 5
Household_ID AGE1 AGE2 AGE3 AGE4
<chr> <chr> <chr> <chr> <chr>
1 1A 25 66 28 81
2 1B 47 23 17 22
3 1C 39 71 R 48
4 1D 50 R R 59
5 1E R 16 80 R
出於我們的意圖和目的,我們將“R”重新編碼為“-9”,以便我們隨后可以將 AGE 列的格式轉換為整數,並進行分析。 我們通常在另一個軟件中這樣做,我的目標是在 R 中復制這個過程。
我設法使用以下代碼做到了這一點:
df <- df %>% mutate(AGE1 = case_when(AGE1 == "R" ~ "-9", TRUE ~ as.character(AGE1)))
df <- df %>% mutate(AGE2 = case_when(AGE2 == "R" ~ "-9", TRUE ~ as.character(AGE2)))
df <- df %>% mutate(AGE3 = case_when(AGE3 == "R" ~ "-9", TRUE ~ as.character(AGE3)))
df <- df %>% mutate(AGE4 = case_when(AGE4 == "R" ~ "-9", TRUE ~ as.character(AGE4)))
鑒於這感覺很笨拙,我嘗試使用 mutate_if 等找到解決方案,但讀到這些已被 cross() 取代。 因此,我嘗試使用 cross() 復制此操作:
df <- df %>%
mutate(across(AGE1:AEG4),
~ (case_when(. == "R" ~ "-9")))
但我收到以下錯誤:
Error: Problem with `mutate()` input `..2`.
x Input `..2` must be a vector, not a `formula` object.
i Input `..2` is `~(case_when(. == "R" ~ "-9"))`.
一直在努力解決這個問題並在谷歌上搜索了一段時間,但無法弄清楚我錯過了什么。 非常感謝有關如何使其工作的一些意見,謝謝。
編輯:解決了!
df <- df %>%
mutate(across(AGE1:AGE4, ~ (case_when(.x == "R" ~ "-9", TRUE ~ as.character(.x)))))
為什么不簡單?
df[,2:5][df[, 2:5] == 'R'] <- '-9'
# A tibble: 5 x 5
Household_ID AGE1 AGE2 AGE3 AGE4
<chr> <chr> <chr> <chr> <chr>
1 1A 25 66 28 81
2 1B 47 23 17 22
3 1C 39 71 -9 48
4 1D 50 -9 -9 59
5 1E -9 16 80 -9
或者也許這與親愛的@TarJae 的解釋沒有太大區別:
library(dplyr)
library(stringr)
df %>%
mutate(across(AGE1:AGE4, ~ str_replace(., "R", "-9")),
across(AGE1:AGE4, as.integer))
# A tibble: 5 x 5
Household_ID AGE1 AGE2 AGE3 AGE4
<chr> <int> <int> <int> <int>
1 1A 25 66 28 81
2 1B 47 23 17 22
3 1C 39 71 -9 48
4 1D 50 -9 -9 59
5 1E -9 16 80 -9
數據:
df <- list(Household_ID = c("1A", "1B", "1C", "1D", "1E"),
AGE1 = c("25", "47", "39", "50", "R"),
AGE2 = c("66", "23", "71", "R", "16"),
AGE3 = c("28", "17", "R", "R", "80"),
AGE4 = c("81", "22", "48", "59", "R"))
df <- as_tibble(df)
您可以將across
與replace
一起replace
。
as_tibble()
進行as_tibble()
列表df %>%
as_tibble() %>%
mutate(across(everything(), ~replace(., . == "R" , "-9"))) %>%
type.convert(as.is=TRUE)
輸出:
Household_ID AGE1 AGE2 AGE3 AGE4
<chr> <int> <int> <int> <int>
1 1A 25 66 28 81
2 1B 47 23 17 22
3 1C 39 71 -9 48
4 1D 50 -9 -9 59
5 1E -9 16 80 -9
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.