Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何在矩阵中的行上复制相同的函数_R_Loops - Fatal编程技术网

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我认为它实际上返回了最后一行的结果。我认为它实际上返回了最后一行的结果。感谢您对我的代码所做的努力和评论。非常有帮助!感谢您的努力和对我的代码的评论。非常有帮助!感谢您的快速解决方案!真的很感谢。这肯定会帮助我进行完整的模拟:)谢谢你的快速解决方案!非常感谢。这肯定会对我的完整模拟有所帮助:)