【问题标题】:Second largest value in a vector of specific object in another vector另一个向量中特定对象的向量中的第二大值
【发布时间】:2021-02-23 16:29:18
【问题描述】:

我有一个包含投资者、公司和股票的非常大的数据框。每家公司都有多个投资者,我希望有一个第四个向量,每个公司的投资者的第二大股票的价值。 展示我使用的最大投资者:

df$bigInv <- aggregate(df$InvShare ~ df$Company, df, max)

这是我的数据框的示例: enter image description here

【问题讨论】:

  • function(x){x[rank(x)==2]} 更改max 有效吗?
  • 您好,感谢您的快速回复!函数运行,但 R 现在显示第二小的份额
  • 为了让我们帮助您,请提供reproducible example。例如,要生成最小数据集,您可以使用head()subset() 或索引。然后使用dput() 给我们一些可以立即放入R 的东西。另外,请确保您知道该怎么做when someone answers your question。更多信息可以在 Stack Overflow 的help center 找到。谢谢!
  • 另一个猜测(没有我无法测试的数据),使用function(x){x[order(x, decreasing=TRUE)==2]}

标签: r aggregate


【解决方案1】:

再现性数据

df <- data.frame(id = c(1, 2, 3, 4, 5, 6, 7, 8),
                 Investor.Name =  c("Shigeo Kageyama", 
                                    "Shigeo Kageyama", 
                                    "Arataka Reigen",   
                                    "Arataka Reigen",  
                                    "Ritsu Kageyama",   
                                    "Ritsu Kageyama",
                                    "Ritsu Kageyama",   
                                    "Tenga Onigawara"),
                 Company = c("Body Improvement Club",   
                             "Salt Middle School",   
                             "Spirits Consultation ", 
                             "Pepper Middle School",
                             "Tofu Spirits School", 
                             "Psycho Helmet Cult",
                             "Chess Club",  
                             "Lecture Club"),
                 InvShare = c(
                           0.45,
                           0.12, 
                           0.89, 
                           0.541, 
                           0.15, 
                           0.75, 
                           0.14, 
                           0.1))

df

# id   Investor.Name               Company InvShare
# 1  1 Shigeo Kageyama Body Improvement Club    0.450
# 2  2 Shigeo Kageyama    Salt Middle School    0.120
# 3  3  Arataka Reigen Spirits Consultation     0.890
# 4  4  Arataka Reigen  Pepper Middle School    0.541
# 5  5  Ritsu Kageyama   Tofu Spirits School    0.150
# 6  6  Ritsu Kageyama    Psycho Helmet Cult    0.750
# 7  7  Ritsu Kageyama            Chess Club    0.140
# 8  8 Tenga Onigawara          Lecture Club    0.100

以下代码将为您提供每家公司第二大投资者的名称。

#The second of the list of affiliation
second = function(x) {
  if (length(x) == 1)
    return(x)
  return(sort(x, decreasing = TRUE)[2])}

aggregate(x = list( InvShare =  df$InvShare),
          by= list(second_member =df$Investor.Name),
          FUN=second)

# second_member InvShare
# 1  Arataka Reigen    0.541
# 2  Ritsu Kageyama    0.150
# 3 Shigeo Kageyama    0.120
# 4 Tenga Onigawara    0.100

这就是您要搜索的内容吗?

[已编辑]

我刚刚意识到您想要在 data.frame 中添加第 4 列。以下几行将做到这一点:

df$second  <- ave(x = df$InvShare,  
                  by = df$Investor.Name, 
                  FUN = second)

df

# id   Investor.Name               Company InvShare second
# 1  1 Shigeo Kageyama Body Improvement Club    0.450  0.120
# 2  2 Shigeo Kageyama    Salt Middle School    0.120  0.120
# 3  3  Arataka Reigen Spirits Consultation     0.890  0.541
# 4  4  Arataka Reigen  Pepper Middle School    0.541  0.541
# 5  5  Ritsu Kageyama   Tofu Spirits School    0.150  0.150
# 6  6  Ritsu Kageyama    Psycho Helmet Cult    0.750  0.150
# 7  7  Ritsu Kageyama            Chess Club    0.140  0.150
# 8  8 Tenga Onigawara          Lecture Club    0.100  0.100

【讨论】:

  • 哇!这是非常令人印象深刻的!非常感谢您的努力。我用你的function(x) { if (length(x) == 1) return(x) return(sort(x, decreasing = TRUE)[2])} 替换了max,效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多