[英]R: subset from a matrix only those rows with a certain value in a certain column
对于一组诊断代码,我有一个大型矩阵“dt”,其中包含超过 2 个月的急诊科就诊次数。 列是“年龄”、“性别”、“日期”、“县”、“邮编”、“主题ID”、“位置”、“诊断”和“dt”; 尺寸为 872344 x 9。
我想从这个矩阵中提取子集并创建一个新矩阵,其中只包含“diag”列的数字在 800 到 849(所有列)之间的那些行。
我一直在忙于构建循环并使用“which”或“if.else”,但我遇到了心理障碍。 如果我只想提取一个诊断代码似乎会更容易,但是这一系列 50 个代码使事情复杂化......指向一个循环? 有没有人有关于如何根据找到某些值进行子集化的想法?
这是我的开始(它不起作用):
dta = dt
b = 800:849
for (i in 1:length(b)) {
}
dta = dt[dt[, 8] >= 800 & dt[, 8] <= 849, ]
ETA:你确定这是一个矩阵而不是一个 data.frame? 如果它是一个data.frame,你可以这样做:
dta = dt[dt$diag >= 800 & dt$diag <= 849, ]
鉴于您的列名,我怀疑您的dt
是一个 data.frame,而不是一个矩阵; 您可以通过运行is.data.frame(dt)
来确认。
如果是这种情况,过滤数据的一种简单方法是使用subset
函数,如下所示:
dta <- subset(dt, diag >= 800 & diag <= 849)
除了上面的优秀答案,我还可以在dpylr
包中添加filter
功能
filter(dt,diag>=800 & diag <= 849)
filter()
与subset()
类似,不同之处在于你可以给它提供任意数量的过滤条件,这些条件用&
连接在一起(不是&&
,这很容易意外地做到!)。 dpylr
包还有其他不错的数据操作功能,你可以看看。
我不会将matrix()
转换为data.frame()
因为它更慢并且会导致更大的内存使用量,而matrix()
操作通常更快。
除了大卫使用列号索引的答案:
dta = dt[dt[,8] >= 800 & dt[,8] <= 849,]
还有使用列名索引和矩阵的形式:
dta = dt[dt[,'metric'] >= 800 & dt[,'metric'] <= 849,]
如针对具有 12 列和 13,241 行的相同矩阵的microbenchmark
包命令所示,使用通过英特尔 MKL 优化编译的 R 运行:
microbenchmark::microbenchmark(
test.matrix = mt[mt[,3] %in% 5:10 & mt[,5] == 1,],
test.data.frame = df[df[,3] %in% 5:10 & df[,5] == 1,],
times = 1000
)
Unit: microseconds
expr min lq mean median uq max neval
test.matrix 885.732 938.386 1154.898 943.74 952.4415 138215.318 1000
test.data.frame 1176.218 1245.826 1363.379 1258.32 1286.4320 3392.556 1000
当矩阵变得非常大时,这种差异变得明显。 在我的机器上,矩阵索引速度也优于data.table
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.