[英]How to replace mutiple nested for loops with apply family functions in R?
[英]replace loops with apply family functions (or dplyr), using logical functions in R
我創建了這個代表性的數據框,該框使用for循環分配條件類別。
df <- data.frame(Date=c("08/29/2011", "08/29/2011", "08/30/2011", "08/30/2011", "08/30/2011", "08/29/2012", "08/29/2012", "01/15/2012", "08/29/2012"),
Time=c("09:45", "10:00", "13:00", "13:30", "10:14", "9:09", "11:23", "17:06", "12:20"),
Diff = c(0.2,4.3,6.5,15.0, 16.5, 31, 30.2, 21.9, 1.9))
df1<- df %>%
mutate(Accuracy=ifelse(Diff<=3, "Excellent", "TBD"))
for(i in 1:nrow(df1)){
if(df1$Diff[i]>3&&df1$Diff[i]<=10){
df1$Accuracy[i]<-"Good"}
if(df1$Diff[i]>10&&df1$Diff[i]<=15){
df1$Accuracy[i]<-"Fair"}
if(df1$Diff[i]>15&&df1$Diff[i]<=30){
df1$Accuracy[i]<-"Poor"}
if(df1$Diff[i]>30){
df1$Accuracy[i]<-"Unacceptable"}
}
我的實際數據集非常大,並且讀取指示for循環通常不是用R編寫代碼的最有效方法。我相信我可以通過為每個條件創建一個邏輯向量來完成相同的事情,並且在每個向量內,TRUE是每個條件為滿足。 然后,我可以通過子集df1 $ Accuracy [Good] <-“ Good”來分配值。 但是,我不知道如何使用Apply系列函數或dplyr函數創建邏輯向量。 (但是,也歡迎使用任何避免for循環的解決方案。)如果for循環是更好的選擇,那么這也將有所幫助。
這是我失敗的嘗試。 這些返回不正確的NA或不正確的邏輯向量。 我不了解的許多事情之一是lapply如何知道要遍歷列或行。
Good<-apply(df1, 1, function(x) ifelse(df1$Diff[x]>3&& df1$Diff[x]<=10, TRUE, FALSE)) #logical, TRUE where condition is true
Good<-unlist(lapply(df1$Diff, function(x) {(ifelse(df1$Diff[x]>3&& df1$Diff[x]<=10, TRUE, FALSE))}))
更新:嵌套ifelse語句將起作用,但是仍然歡迎有關如何使用apply的任何建議。
mutate(Accuracy=ifelse(pDiff<=3, "Excellent",
ifelse(pDiff>3&pDiff<=10, "Good",
ifelse(pDiff>10&pDiff<=15, "Fair",
ifelse(pDiff>15&pDiff<30, "Poor",
ifelse(Diff>30, "Unpublishable", "TBD"))))))
您可以使用case_when
的dplyr
:
df1<- df %>%
mutate(Accuracy= case_when(
.$Diff <= 3 ~ "Excellent",
.$Diff <= 10 ~ "Good",
.$Diff <= 15 ~ "Fair",
.$Diff <= 30 ~ "Poor",
.$Diff > 30 ~ "Unpublishable",
TRUE ~"TBD")
)
df1
Date Time Diff Accuracy
1 08/29/2011 09:45 0.2 Excellent
2 08/29/2011 10:00 4.3 Good
3 08/30/2011 13:00 6.5 Good
4 08/30/2011 13:30 15.0 Fair
5 08/30/2011 10:14 16.5 Poor
6 08/29/2012 9:09 31.0 Unpublishable
7 08/29/2012 11:23 30.2 Unpublishable
8 01/15/2012 17:06 21.9 Poor
9 08/29/2012 12:20 1.9 Excellent
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.