J'ai une très grande base de données avec des investisseurs, des entreprises et des actions. Chaque entreprise a plusieurs investisseurs et je veux avoir un 4ème vecteur avec la valeur des deuxièmes plus grosses actions de l'investisseur de chaque entreprise. Pour montrer le plus gros investisseur que j'ai utilisé :

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

Voici un exemple de mon bloc de données : entrez la description de l'image ici

1
Scrappycoco 11 nov. 2020 à 20:01

1 réponse

Meilleure réponse

Données pour la reproductibilité

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

Le code suivant vous donnera le nom du deuxième plus gros investisseur dans chaque entreprise.

#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

C'est ça que tu cherchais ?

[ MODIFIÉ ]

Je viens de réaliser que vous vouliez une 4ème colonne sur votre data.frame. Les lignes suivantes le feront :

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
3
Álvaro A. Gutiérrez-Vargas 11 nov. 2020 à 18:22