簡體   English   中英

如何同時使用mutate_at或mutate_if對數據執行多項操作

[英]How to use mutate_at or mutate_if at the same time to do multiple action on data

我想使用一個代碼對數據中的相同變量應用3個函數。 我有一個數據集,我的數據中有某些列,我想將這些功能應用於所有這些列。 1-使它們成為所有因子數據2-用缺失值替換列中的空格(將空間值轉換為缺失值)3-使用fct_explicit_na給缺失值明確的因子水平

我已經在單獨的代碼行中完成了此操作,但是我想使用dplyr mutate函數合並所有這些代碼。 我嘗試了以下內容,但沒有工作

cols <- c("id12", "id13", "id14", "id15")

data_new <- data_old %>%                 
  mutate_if(cols=="", NA) %>%            # replace space with NA for cols
  mutate_at(cols, factor) %>%            # then turn them into factors
  mutate_at(cols, fct_explicit_na)       # give NAs explicit factor level
  )

我收到錯誤消息: tbl_if_vars(.tbl,.p,.env,...,。include_group_vars = .include_group_vars)中的錯誤:length(.p)== length(tibble_vars)不正確

mutate_if步驟未執行OP打算執行的操作。 相反,我們可以一步完成

library(dplyr)
data_old %>%
       mutate_at(vars(cols), ~ na_if(., "") %>%
                                 factor %>%
                                 fct_explicit_na)

為什么OP的代碼不起作用?

使用可重現的示例,下面的代碼將factor列轉換為character

iris1 <- iris %>% 
            mutate_if(is.factor, as.character) %>%
            mutate(Species = replace(Species, c(1, 3, 5), ""))

現在,如果我們這樣做

iris1 %>%
      mutate_if("Species" == "", NA)

它正在比較兩個字符串,而不是檢查列值。 同樣, mutate_if應該返回一個length 1的邏輯向量以選擇該列。

相反,如果我們使用

iris1 %>%
     mutate_if(~ any(. == ""), ~ na_if(., "")) %>%
     head

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM