【发布时间】:2018-01-30 02:51:00
【问题描述】:
我想在 R 中对数据框的值进行子集化。首先,我想选择 "≥35%" 类别。其次,在第一步之后,我想选择“百分比”值的最大值。这是我原始 CSV 文件的一些部分。
ID Code Code2 Percent category
A001 0123 10000 0 <35%
A001 0123 20000 66 ≥35%
A001 0123 30000 34 <35%
B001 7894 52003 100 ≥35%
C001 2020 35001 20 <35%
C001 2020 35002 20 <35%
C001 2020 35003 20 <35%
C001 2020 35004 20 <35%
C001 2020 35005 20 <35%
但是,我希望如下图所示过滤我的数据框。
ID Code Code2 Percent category
A001 0123 20000 66 ≥35%
B001 7894 52003 100 ≥35%
C001 2020 35001 20 <35%
C001 2020 35002 20 <35%
C001 2020 35003 20 <35%
C001 2020 35004 20 <35%
C001 2020 35005 20 <35%
实际上,我尝试了一些 R 代码以得到我想要得到的结果。
X <- subset(dataframe, category =="≥35%" | Percent == max(Percent))
但是这段代码没有给出结果;因此,我使用了另一个代码。
X <- do.call(rbind, lapply(split(dataframe, as.factor(dataframe$ID)), function(x) {return(x[which.max(x$Percent),])}))
然而,它也不起作用。
【问题讨论】:
-
您描述它的方式实际上并不关心每个 ID 的哪个大于或等于 35%,因为您希望保留最大行数,尽管它们小于 35%。这可以通过修改你的代码来解决,稍微提取所有对应于其各自 ID 的最大值:
do.call(rbind, lapply(split(dataframe, dataframe$ID), function(x) x[x$Percent==max(x$Percent),]))。这是你要找的吗? -
@henrik_ibsen 我可以过滤“≥35%”的值。但是,我不知道如何为最大结果设置 R 代码。首先,我提取了具有“≥35%”值的 ID 值。在这种情况下,这些 ID 是 A001 和 B001。然后,我选择了一个只有“
-
@henrik_ibsen 我的猜测是 C001 的最大值应该有 Code2,从 35001 到 3500,因为 C001 的所有值都是 20%。尽管如此,'which.max()' 函数给出了 ID C001 的唯一 35001 Code2。你明白我说了什么吗?并感谢您的评论。
-
我不确定为什么我提供的代码不适合您。与您的相比,它在处理最大值和索引的方式上有着根本的不同。当我这样做时它会起作用并准确地再现您问题的第二个 data.frame 。
which.max()只确定第一个最大值的索引。我的(应该...)确定列表中每个 data.frame 的所有索引都等于最大值。