如果/ else函数在数据帧上创建条件矩阵

时间:2018-06-13 12:02:54

标签: r if-statement

以下是可重复性的数据集:

    a=c(90.41,37.37,18.98)
    b=c(103.39,39.44,51.68)
    c=c(83.51,36.41,47.46)
    d=c(94.60,38.57,50.22)
    e=c(95.04,38.81,50.49)
    xx=t(data.frame(a,b,c,d,e))
    df=data.frame(xx)

这是我试图在数据框上运行的if / else函数

 classify=function(df){
 if (df>=110) {
 class="5"}
 else if (df<110 & df>=103){
 class="4"}
 else if (df<103 & df>=95){
 class="3"}
 else if (df<95 & df>=76){
 class="2"}
 else if (df<76){
 class="1"}
 else {class="none"}
 }  

但是,我想要生成的if / else函数是一个新的数据框,如下所示:

     df
     X1 X2 X3
    a  2  1  1
    b  4  1  1
    c  2  1  1
    d  2  1  1
    e  3  1  1

我不确定如何做到这一点,所以任何帮助都会受到超级赞赏。我预计if / else函数本身有问题,但我很缺乏经验,我不知道如何轻松地检测脚本中的错误。谢谢!

3 个答案:

答案 0 :(得分:5)

sapply(df, function(x) {as.numeric(as.character(cut(x, c(-Inf,76,95,103,110,Inf), seq(1:5))))})

     X1 X2 X3
[1,]  2  1  1
[2,]  4  1  1
[3,]  2  1  1
[4,]  2  1  1
[5,]  3  1  1

使用cut设置间隔(第二个参数)和标签(第三个参数)。但是,它会返回一个因子,因此如果您愿意,请转换回数字。由于您希望在整个数据帧上运行该函数,请使用sapply或lapply。

答案 1 :(得分:2)

您可以使用@FXML void minimize(MouseEvent event) { Stage stage=(Stage) iconMinimize.getScene().getWindow(); stage.setIconified(true); } 执行此操作。你所要做的就是传递一个非递减的断点向量。

findInterval

答案 2 :(得分:2)

使用"XYZ":{any white space}"{any set of digits}@{anychars}", 中的case_when

,对您的示例采用了类似的方法
dplyr

万一:

library(dplyr)

classify <- function(x){
  case_when(
    x >= 110 ~ "5",
    x >= 103 & x < 110 ~ "4",
    x >= 95 & x < 103 ~ "3",
    x >= 76 & x < 95 ~ "2",
    x < 76 ~ "1",
    TRUE ~ "none"
  )
}

a = c(90.41, 37.37, 18.98)
b = c(103.39, 39.44, 51.68)
c = c(83.51, 36.41, 47.46)
d = c(94.60, 38.57, 50.22)
e = c(95.04, 38.81, 50.49)

df <- data.frame(matrix(c(a, b, c, d, e), ncol = 3, byrow = T))

mutate_all(df, classify)

#  X1 X2 X3
#1  2  1  1
#2  4  1  1
#3  2  1  1
#4  2  1  1
#5  3  1  1

结果如下:

df
#      X1    X2    X3
#1   -Inf 37.37 18.98
#2 103.39   NaN 51.68
#3  83.51 36.41 47.46
#4  94.60   Inf 50.22
#5  95.04 38.81    NA