R 如何在矩阵中的行上复制相同的函数
我正在尝试编写一个循环,确定哪个单元格的值最大,并选择该单元格作为结果,使用高-中或低字符串。这是试用的数据R 如何在矩阵中的行上复制相同的函数,r,loops,R,Loops,我正在尝试编写一个循环,确定哪个单元格的值最大,并选择该单元格作为结果,使用高-中或低字符串。这是试用的数据 data <- matrix(c(0.3000003,0.3299896,0.3700101, 0.3299896,0.3700101,0.3000003, 0.3700101,0.3000003,0.3299896, 0.3000003,0.3299896,0.3700101,
data <- matrix(c(0.3000003,0.3299896,0.3700101,
0.3299896,0.3700101,0.3000003,
0.3700101,0.3000003,0.3299896,
0.3000003,0.3299896,0.3700101,
0.3299896,0.3700101,0.3000003,
0.3700101,0.3000003,0.3299896),6,3)
colnames(data) <- c("Low","Medium","High")
rownames(data) <- paste("case",1:6)
> data
Low Medium High
case 1 0.3000003 0.3700101 0.3299896
case 2 0.3299896 0.3000003 0.3700101
case 3 0.3700101 0.3299896 0.3000003
case 4 0.3299896 0.3000003 0.3700101
case 5 0.3700101 0.3299896 0.3000003
case 6 0.3000003 0.3700101 0.3299896
data以下是您可能更喜欢的矢量化解决方案:
colnames(data)[apply(data, 1, which.max)]
# [1] "Medium" "High" "Low" "High" "Low" "Medium"
这是您尝试的简明版本:将函数which.max
应用于数据的每一行(维度1
),并获得相应的列名
就您的尝试而言,这里有一个更正版本:
assign.levels <- function(data) {
scored.thetas.1 <- rep(NA, nrow(data))
for (i in 1:nrow(data))
scored.thetas.1[i] <- names(which.max(data[i, ]))
scored.thetas.1
}
assign.levels(data)
# [1] "Medium" "High" "Low" "High" "Low" "Medium"
assign.levels以下是您可能更喜欢的矢量化解决方案:
colnames(data)[apply(data, 1, which.max)]
# [1] "Medium" "High" "Low" "High" "Low" "Medium"
这是您尝试的简明版本:将函数which.max
应用于数据的每一行(维度1
),并获得相应的列名
就您的尝试而言,这里有一个更正版本:
assign.levels <- function(data) {
scored.thetas.1 <- rep(NA, nrow(data))
for (i in 1:nrow(data))
scored.thetas.1[i] <- names(which.max(data[i, ]))
scored.thetas.1
}
assign.levels(data)
# [1] "Medium" "High" "Low" "High" "Low" "Medium"
assign.levels这应该很快
colnames(data)[max.col(data)]
#[1] "Medium" "High" "Low" "High" "Low" "Medium"
这里有一个小基准
n <- 1e6
set.seed(1)
data <- matrix(runif(n * 3), ncol = 3)
colnames(data) <- c("Low","Medium","High")
library(microbenchmark)
benchmark <- microbenchmark(
OP = assign.levels(data), # as defined in Julius's answer
Julius = colnames(data)[apply(data, 1, which.max)],
markus = colnames(data)[max.col(data)], times = 20
)
autoplot(benchmark)
n这应该很快
colnames(data)[max.col(data)]
#[1] "Medium" "High" "Low" "High" "Low" "Medium"
这里有一个小基准
n <- 1e6
set.seed(1)
data <- matrix(runif(n * 3), ncol = 3)
colnames(data) <- c("Low","Medium","High")
library(microbenchmark)
benchmark <- microbenchmark(
OP = assign.levels(data), # as defined in Julius's answer
Julius = colnames(data)[apply(data, 1, which.max)],
markus = colnames(data)[max.col(data)], times = 20
)
autoplot(benchmark)
n我认为它实际上返回了最后一行的结果。我认为它实际上返回了最后一行的结果。感谢您对我的代码所做的努力和评论。非常有帮助!感谢您的努力和对我的代码的评论。非常有帮助!感谢您的快速解决方案!真的很感谢。这肯定会帮助我进行完整的模拟:)谢谢你的快速解决方案!非常感谢。这肯定会对我的完整模拟有所帮助:)