我想将 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/