【发布时间】:2018-01-10 18:13:42
【问题描述】:
假设我有一个像这样的数据框:
set.seed(4)
df<-data.frame(
group = rep(1:10, each=3),
id = rep(sample(1:3), 10),
x = sample(c(rep(0, 15), runif(15))),
y = sample(c(rep(0, 15), runif(15))),
z = sample(c(rep(0, 15), runif(15)))
)
如上所示,x、y、z 向量的某些元素取值为零,其余的取自 0 和 1 之间的均匀分布。
对于由第一列确定的每个组,我想从第二列中找到三个 ID,分别指向组中变量 x、y、z 的最大值。假设没有平局,除了变量在给定组的所有观察中取值为 0 的情况 - 在这种情况下,我不想返回任何数字作为具有最大值的行的 id。
输出如下所示:
group x y z
1 2 2 1
2 2 3 1
... .........
我的第一个想法是为每个变量分别选择具有最大值的行,然后使用merge 将其放入一个表中。但是,我想知道是否可以在没有 merge 的情况下完成它,例如使用标准的 dplyr 函数。
【问题讨论】:
-
使用
data.table你可以试试setDT(df)[,lapply(.SD,function(x) id[which.max(x)]),by=group,.SDcols=c("x","y","z")] -
在使用
sample和runif等功能时请使用set.seed。你可以试试library(dplyr); df %>% group_by(group) %>% summarise_at(vars(-id), funs(which.max)) -
预期输出“1 5 2 4”中的第一行是否意味着组 1 在 X 列中的 id 5、y 列中的 id2 和 z 列中的 id 4 具有最高值?如果是,那么您是否期望只有 2 行输出?那么为什么预期输出中的延续点?
-
@Aramis7d 输出中的行数应等于组数。我使用了这些点,因为我希望在这个例子中输出有 10 行。至于第一个问题,对于每个组,我想获得三个值,它们来自
id列,它们指向给定组中x、y、z的最大值。我不确定你问的是不是这个。另外,请注意我更改了示例,以便预期输出与生成示例的代码匹配。 -
@Sotos 根据建议添加了
set.seed,谢谢。还要感谢您的代码,它似乎正在工作。您为什么不将其发布为答案?我很乐意批准它。