2017-05-01 55 views
0

This答案描述瞭如何傳遞要在函數內部進行評估的表達式。數據幀上多重表達式的評估

我的問題:

有沒有辦法通過多個條件進行評估?

我有比如函數:

createFactor <- function(df, column, condition, label){ 
    df[column] <- NA  
    for(l in label){ 
    df[,column][condition] <- l 
    } 
return(df) 
} 

這是我到目前爲止得到了一個條件:

set.seed(26) 
dataset <- matrix(sample(c(NA, 1:5), 25, replace = TRUE), 5) 
df <- as.data.frame(dataset) 
tempMerge_TEST <- createFactor(df, 
          column='V2', 
          condition=df$V1==1, 
          label='medium') 

結果:

V1  V2 V3 V4 V5 
1 NA <NA> 3 1 5 
2 1 medium 1 2 4 
3 5 <NA> 3 2 2 
4 4 <NA> NA 3 2 
5 1 medium 4 4 1 

但我想這個功能就像這樣工作:

set.seed(26) 
dataset <- matrix(sample(c(NA, 1:5), 25, replace = TRUE), 5) 
df <- as.data.frame(dataset) 
tempMerge_TEST <- createFactor(df, 
          column='V2', 
          condition=c(df$V1==1, df$V5==5), 
          label=c('medium', 'high')) 

有了結果:

V1  V2 V3 V4 V5 
1 NA high 3 1 5 
2 1 medium 1 2 4 
3 5 <NA> 3 2 2 
4 4 <NA> NA 3 2 
5 1 medium 4 4 1 

我寧願提前基地R.感謝解決方案。

回答

2

這可以通過以下的調整來完成:

createFactor <- function(df, column, condition, label){ 
    df[column] <- NA  
    for(i in seq_along(label)) { 
    df[,column][condition[[i]]] <- label[i] 
    } 
    return(df) 
} 

set.seed(26) 
dataset <- matrix(sample(c(NA, 1:5), 25, replace = TRUE), 5) 
df <- as.data.frame(dataset) 
tempMerge_TEST <- createFactor(df, 
           column='V2', 
           condition=list(df$V1==1, df$V5==5), 
           label=c('medium', 'high')) 

請注意函數是怎麼被調用一個重要的區別:改變condition=c(df$V1==1, df$V5==5)condition=list(df$V1==1, df$V5==5)(改變c()list())。這是必要的,因爲c()將連接兩個條件,當你真正想要的是兩個條件的工作列表。


最後,當你想要一個基礎R解決方案,從dplyr的case_when功能對於這樣的情況非常有幫助:

library(dplyr) 
df %>% 
    mutate(V2 = case_when(V1 == 1 ~ "medium", 
         V5 == 5 ~ "high"))