【问题标题】:How can I extract the maximum values?如何提取最大值?
【发布时间】: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 的所有索引都等于最大值。

标签: r subset


【解决方案1】:
library(dplyr)

#processing on data where category is equal to '<35%' ONLY
df_le <- df %>%
  group_by(ID) %>%
  filter(!any(category == '≥35%')) %>%
  filter(Percent==max(Percent)) %>%
  data.frame()

#final data by combining both categories
final_df <- rbind(df %>%
                    filter(category=='≥35%'),
                  df_le)
final_df

输出是:

    ID Code Code2 Percent category
1 A001  123 20000      66    >=35%
2 B001 7894 52003     100    >=35%
3 C001 2020 35001      20     <35%
4 C001 2020 35002      20     <35%
5 c001 2020 35003      20     <35%
6 C001 2020 35004      20     <35%
7 C001 2020 35005      20     <35%

样本数据:

df <- structure(list(ID = c("A001", "A001", "A001", "B001", "C001", 
"C001", "c001", "C001", "C001"), Code = c(123L, 123L, 123L, 7894L, 
2020L, 2020L, 2020L, 2020L, 2020L), Code2 = c(10000L, 20000L, 
30000L, 52003L, 35001L, 35002L, 35003L, 35004L, 35005L), Percent = c(0L, 
66L, 34L, 100L, 20L, 20L, 20L, 20L, 20L), category = c("<35%", 
">=35%", "<35%", ">=35%", "<35%", "<35%", "<35%", "<35%", "<35%"
)), .Names = c("ID", "Code", "Code2", "Percent", "category"), class = "data.frame", row.names = c(NA, 
-9L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多