簡體   English   中英

R自定義函數以清理數據

[英]R Custom Functions to Clean Data

我正在嘗試制作一個自定義的R腳本,以幫助我在做很多有趣的事情之前清理數據。 當前數據集中的許多列都具有yes / no值,我認為如果將它們設為二進制1/0值將更容易瀏覽。 當前集有10列這樣做,而這樣做十次確實起作用:

sd$PhoneService<-ifelse(sd$PhoneService=='Yes', 1,0)

它不容易重復。 這對於這個特定項目是可行的,但是如果您有一個需要轉換的包含100列的數據集,則必須有一種方法來實現。 我不能只看它具有的級別數,因為還有其他的列具有兩個級別,因此對於二進制來說意義不大。 因此,我需要一種方法讓R遍歷表,找到只有兩個級別的列,檢查這兩個級別分別為“是”和“否”,然后將它們轉換為1和0。

這是我嘗試過的:

#Get source data
sd = read.csv("source/xyz.csv", header = T, stringsAsFactors=T)

#Clean up data
twoLevelClean <- function(b){
  lvlsNames = levels(b)
  ifelse(lvlsNames == "Yes", print(lvlsNames), print("Not yes no"))
}

cleanData <- function(a){
  lvls = nlevels(a)
  ifelse(lvls == 2, sapply(a, twoLevelClean), print("Not 2"))
}

sapply(sd, cleanData)

這只是開始吐出這樣的隨機輸出:

...
[1] "No"  "Yes"
[1] "Not yes no"
[1] "No"  "Yes"
[1] "Not yes no"
[1] "No"  "Yes"
[1] "Not yes no"
[1] "No"  "Yes"
[1] "Not yes no"
...

我認為它的第一列具有1000多個唯一值,但具有兩個以上的級別。 我也不確定我會采用正確的方法。 我應該先看一下水平嗎? 我希望twoLevelClean函數僅在觸發它的列上運行,但是我認為這沒有發生。 我認為這是從頭開始的。

for語句對此會更好嗎? 我可以索引列並在某些列上運行某些功能嗎?

在原始數據集上使用tidyverse包,您可以運行以下代碼:

Original_data_frame <- data.frame(
    c(1:10),
    c(rep("Yes",5),rep("No",5)),
    c(rep("Yes",5),rep("No",5))
)

names(Original_data_frame ) <- c("id","Var1","Var2")

使用dplyr軟件包的mutate_at函數:

Original_data_frame_mod <- Original_data_frame %>% 
    mutate_at(.vars = vars(Var1,Var2), .funs = funs(ifelse(.=="Yes",1,0)))

您可以按照以下方式進行操作:

yn_to_10 = function(x) {
    if (! is.factor(x)) return(x)
    if (! identical(levels(x), c("no", "yes")) return(x)
    return(ifelse(x == "yes", 1, 0))
}

your_data[] = lapply(your_data, yn_to_10)

但是您應該聽一下注釋-因數在內部存儲為整數(從1開始,而不是0),因此將兩級因數更改為二進制0/1並不會真正改變。

暫無
暫無

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

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