我是 R 新手。我有一个问题要解决,下面的一个工作函数可以很好地解决它(在适当的时间)。但是,从我在 R 教程和 SO 上阅读的内容来看,我觉得我正在做太多的工作来解决它。有没有一些花哨的 R 方法可以将这一切折叠成几行?
要解决的问题:给定一个字符数据的 CSV 文件和一个“标志”参数,提取位置 [row, 1] 处的值。“行”计算为“标志 a”的“InterestingColumn”列中的最小值,“标志 b”的“有趣列”列中的最大值,或由数字“标志”定义的第 n 个值。输出应按“InterestingColumn”的唯一值分组。返回的结果应该是一个数据框。列模式是已知的,但文件的长度是未知的。
我的直觉是我应该能够完全摆脱 for 循环,而且我每次用 rbind 重建矩阵效率低下(像这样?)任何指导将不胜感激,谢谢!
myfunc <- function(flag = "a") {
csv <- read.csv("data.csv", colClasses = "character")
col <- unique(csv$InterestingColumn)
output <- NULL
for (i in 1:length(col)) {
sub <- subset(csv, InterestingColumn == col[i])
vals <- as.numeric(sub[, 12])
if (flag == "a") {
output <- rbind(output, matrix(c(sub[which.min(vals),1], col[i]), ncol = 2))
}
else if (flag == "b") {
output <- rbind(output, matrix(c(sub[which.max(vals),1], col[i]), ncol = 2))
}
else if (is.numeric(flag)) {
output <- rbind(output, matrix(c(sub[flag,1], col[i]), ncol = 2))
}
colnames(output) <- c("data", "col")
as.data.frame(output)
}
}