r - 带有 IF 语句的函数适用于多列

标签 r function if-statement apply

我想将 IF 语句应用于多个列(本质上是整个数据框),并采用创建函数的方法来执行此操作。目的是将列中的数据替换为代表该数字所属组的数字。

数据样本如下所示:

> Mat
        A    B    C    D    E
E1   8.45 6.65 7.35 5.18 3.11
E2  12.59 4.18 4.08 0.95 1.75
E3  15.93 3.05 1.81 2.77 4.42
E4  15.93 3.05 1.81 2.77 4.42
E5  11.57 4.48 4.70 2.01 1.08
E6   8.17 7.05 7.70 5.38 3.45
E7  11.57 4.48 4.70 2.01 1.08
E8   9.49 5.41 6.51 5.78 3.20
E9  11.71 4.40 4.58 1.87 1.11
E10  9.52 5.49 6.63 6.07 3.49

我尝试创建的函数将采用 IF 语句并查看列中的每个值,并根据值将其替换为 1 到 6 之间的组编号(对于 1 到 10 之间的数字)和 NA对于大于 10 的数字。当我为一列手动写出它时,IF 语句本身就起作用了。我写的函数是这样的(称为分组):

# write user function to apply the loop

Grouping = function(data) {
  for(i in 1:length(x)) {
    if(x[i] < 1) {
      x[i] = 1
    } else if (x[i] < 3) {
      x[i] = 3
    } else if (x[i] < 4) {
      x[i] = 4
    } else if (x[i] < 5) {
      x[i] = 5
    } else if (x[i] < 10) {
      x[i] = 6
    } else
      x[i] = "NA"
  }
} 

当我尝试使用apply时使用该函数我的错误是:

> apply(Mat, 1, Grouping)
Error in FUN(newX[, i], ...) : object 'x' not found

显然问题出在我对用户函数的构造中,但我不确定哪里出了问题,因为我对函数创建还很陌生。

感谢任何帮助!

谢谢!

最佳答案

在处理向量时,你确实应该使用 ifelse,而不是循环。

grouping <- function(x)
{
    ifelse(x < 1, 1,
    ifelse(x < 3, 3,
    ifelse(x < 4, 4,
    ifelse(x < 5, 5,
    ifelse(x < 10, 6,
    NA)))))
}
data[] <- lapply(data, grouping)

或者更好的是,使用 cut 将数字向量转换为带:

grouping <- function(x)
{
    x <- cut(x, c(-Inf, 1, 3, 4, 5, 10), labels=c(1, 3, 4, 5, 6), right=FALSE)
    as.numeric(as.character(x))
}
data[] <- lapply(data, grouping)

关于r - 带有 IF 语句的函数适用于多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36092028/

相关文章:

python - python字典中没有值

.net - 嵌套If Else语句与ElseIf语句的性能差异

r - CRAN -R中的百分位数函数在哪里

javascript - 如何制作返回其内部函数值的函数?

r - 使用 R 中的 openxlsx 包将样式应用于工作簿的所有工作表

r - 创建函数来格式化数据框中的列

python - 函数全局/局部变量更新问题

C: 'else' 当条件满足时执行 - 结构

r - Pheatmap display_numbers 参数

r - TM 包中删除 URLS 的 gsub 函数不会删除整个字符串