嗨,如果问过这个问题,请重定向 - 我看不到它。
我想使用R,并拥有一个简单的数据帧: 第一列是ID,第二列是分数。 每个ID有36行和相应的分数。 有几千个ID。
我想生成一个包含以下内容的摘要: 每个唯一ID的1个条目,其最高分为36行。
我也是R的新手,但知道以下内容:
apply(dataframe,2,max)将给出最大值,但不会按ID分解。
我知道有一系列“应用”函数可以在表上应用函数,但我不知道如何组合以获得我想要的东西。
如果它在Excel中,它将相当于一个简单的Pivot表 - 但我想学习如何在R中有效地完成它。
非常感谢
答案 0 :(得分:5)
您可以使用其中一个聚合函数。在base R
。我们可以使用公式方法aggregate
。 .
的LHS上的~
指定除分组变量&ID; ID'之外的所有其他变量。这是~
的RHS。我们将max
指定为FUN
,它将为每个列的max
值提供一个摘要数据集,按ID'
aggregate(.~ID, df, FUN=max)
或另一个选项是dplyr
。我们按照ID'分组并在summarise_each
内使用max
与funs
一起获取每列的max
值。
library(dplyr)
df %>%
group_by(ID) %>%
summarise_each(funs(max))
或者我们可以转换' data.frame'到' data.table' (setDT(df)
)。由ID'组成的ID'在列中,我们通过使用max
循环Data.table(.SD
)的子集来获取每列的lapply
。
library(data.table)
setDT(df)[,lapply(.SD, max) , by = ID]
如果除了" ID"之外只有一列,我们可以使用summarise
代替summarise_each
,即
df %>%
group_by(ID) %>%
summarise(score=max(score))
如果是单列,data.table
的类似代码是
setDT(df)[, list(score=max(score)), by = ID]