2016-02-05 106 views
2

對於一個簡單的數據幀:如果根據數據幀中的另一列聲明:R中

df <- structure(list(id = 1:9, sex = structure(c(2L, 2L, 1L, 2L, 1L, 
               1L, 2L, 2L, 1L), .Label = c("f", "m"), class = "factor"), score = c(55L, 
                                60L, 62L, 47L, 45L, 52L, 41L, 46L, 57L)), .Names = c("id", "sex", 
                                             "score"), class = "data.frame", row.names = c(NA, -9L)) 

我想寫一些如果基於分數男性和女性的陳述。基本IF函數會是這樣的:

df$score3<-ifelse(df$score <45,"low",  
         ifelse(df$score>=45 & df$score<55,"normal", 
           ifelse(df$score >=55,"high", NA))) 

我將如何改變這種表達男性只(單獨截止值將被用於女性(說低= < 50,正常=> = 50 & < 58,高=> = 58))。

如果在數據框中使用基於另一列的if語句的任何建議,我將不勝感激。

+0

使用'ifelse(DF $性== 'M',COND1,COND2)'? cond1代表男性和女性cond2的臨界值。 – ytk

回答

4

使用數據結構來表示你的標準

criteria<-list(m=c(0,50,58),f=c(0,45,55)) 
labels<-c("low","normal","high") 
grade<-function(score,sex) labels[findInterval(score,criteria[[sex]])] 

df$grade<-mapply(grade,df$score,as.character(df$sex)) 
 
    id sex score grade 
1 1 m 55 normal 
2 2 m 60 high 
3 3 f 62 high 
4 4 m 47 low 
5 5 f 45 normal 
6 6 f 52 normal 
7 7 m 41 low 
8 8 m 46 low 
9 9 f 57 high 
相關問題