【发布时间】:2014-04-29 17:34:37
【问题描述】:
我问这个问题是this one 的后续问题,@alexis_laz 以非常简洁的方式回答了这个问题。 不幸的是,他的方法(包括创建一个带有零负载的长数据框)现在原始数据集已经急剧扩展,因此数据过于密集。
基本问题就是这个。
考虑一个具有三列 x、y、z 的数据框。我正在寻找与每个 y 的最低 x 值相关联的 z 和 x 的值。理想的输出是y[i]_x[i]_z[i] 类型的字符串,其中 i 是相关的行号。
这是一个可重现的示例
set.seed(1)
x <- rpois(10000, lambda = 10); x[sample.int(50, 20)] <- NA
y <- rep(LETTERS, length.out=10000)
z <- seq(1:10000)
df <- data.frame(cbind(x,y,z))
所需的输出(我通过简单地订购 df 和滚动找到):
df <- df[order(y,x,z),]
- 对于 y = A,min(x) = 2,z = 313 => 所需的结果(NA 可以被删除)应该类似于
paste0(y,"_",x,"_",z)因此 A_1_313 - 对于 y = B,min(x) = 2,z = 782、6008 或 7230 => 所需结果将为我提供所有三个字符串,即 B_2_782、B_2_6008 和 B_2_7230
- 对于 y = F,min(x) = 3,这个最小值与 5 个不同的 z 值(4114、4712、5336、7234、7520)相关,所以我想得到五个字符串 ....
我不希望在真实数据集中的任何地方都有超过 5 个字符串作为输出。 如前所述,@alexis_laz 为几乎相同的问题(我也问过)提供了一个解决方案,但该解决方案需要创建一个超过我的计算机能力的数据帧(>2.4GB 数据帧,6.5 亿行),因为我的数据集已经从37 到 15000 家公司:)
提前致谢!
PS:
我已经使用max.col、which.max 和tapply 寻找解决方案,但到目前为止没有一个对我有用。似乎tapply(x,y,which.min) 之类的东西只是在有序 df 中返回 1 的列表,因为 which.min 返回向量/矩阵中的位置,该位置在 tapply 函数中始终为 1。因此,使用 tapply 但返回 df 的行号的东西将是工作的 99%。
【问题讨论】: