Удалить неуникальные переменные - PullRequest
0 голосов
/ 25 апреля 2020

предположим, у меня есть тиббл:

# A tibble: 9 x 4
  PD          Var                                       P  R.sq
  <chr>       <chr>                                 <dbl> <dbl>
1 CommercialB Charge.OffRates.TotalLoansAndLeases  -0.473  1   
2 CommercialB HealthInsuranceCoverage.SC2           2.15   0.9 
3 CommercialB HealthInsuranceCoverage.SC3          -0.352  0.5 
4 CommercialB HealthInsuranceCoverage.SC4           0.640  0.4 
5 CommercialB HealthInsuranceCoverage.SC1           0.587  0.3 
6 CommercialB Charge.OffRates.TotalLoansAndLeases1  1.14   0.2 
7 CommercialB Charge.OffRates.TotalLoansAndLeases4 -0.437  0.08
8 CommercialB Charge.OffRates.TotalLoansAndLeases3  2.32   0.06
9 CommercialB Charge.OffRates.TotalLoansAndLeases2 -0.273  0.01

Мой вопрос: как мне извлечь одно имя из каждой группы столбца Var?

Я пытался использовать distinct(), но еще вернул полные данные. Я не уверен, как сказать R знать, что я хочу, чтобы выходные данные были вектором, который возвращает имена в Vars, которые имеют наибольшее значение R.sq. Например, выходные данные будут иметь следующий вид:

>c(tib$Var['Charge.OffRates.TotalLoansAndLeases'],tib$Var['HealthInsuranceCoverage.SC2'])

Позже я буду использовать выходные данные для преобразования гораздо большего значения df, где имена столбцов соответствуют записям строк для Var Может кто-нибудь, пожалуйста, помогите мне?

tib <- structure(list(PD = c("CommercialB", "CommercialB", "CommercialB", 
"CommercialB", "CommercialB", "CommercialB", "CommercialB", "CommercialB", 
"CommercialB"), Var = c("HealthInsuranceCoverage.SC4", "HealthInsuranceCoverage.SC3", 
"HealthInsuranceCoverage.SC2", "HealthInsuranceCoverage.SC1", 
"Charge.OffRates.TotalLoansAndLeases4", "Charge.OffRates.TotalLoansAndLeases3", 
"Charge.OffRates.TotalLoansAndLeases2", "Charge.OffRates.TotalLoansAndLeases1", 
"Charge.OffRates.TotalLoansAndLeases"), P = c(0.639854267828088, 
-0.352112247223695, 2.14688262893268, 0.586980189852499, -0.437388302395368, 
2.3210132561933, -0.272751224405276, 1.13554334651023, -0.473126862945436
), R.sq = c(0.4, 0.5, 0.9, 0.3, 0.08, 0.06, 0.01, 0.2, 1)), row.names = c(NA, 
-9L), class = c("tbl_df", "tbl", "data.frame"))
> 

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Вы можете group_by PD и удалить цифры из Var и выбрать max строку с R.sq.

library(dplyr)

tib %>% group_by(PD, Var = sub('\\d+$', '', Var)) %>% slice(which.max(R.sq))

#   PD          Var                                    P  R.sq
#  <chr>       <chr>                                <dbl> <dbl>
#1 CommercialB Charge.OffRates.TotalLoansAndLeases -0.473   1  
#2 CommercialB HealthInsuranceCoverage.SC           2.15    0.9

Если вам нужно несколько столбцов, вы можете select их.

0 голосов
/ 25 апреля 2020

Опция с использованием data.table:

setDT(DF)[DF[, .I[which.max(v4)], .(v1, gsub("\\d+$", "", v2))]$V1]

данные:

DF <- structure(list(v1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L), .Label = c("g1", "g3"), class = "factor"), v2 = structure(1:10, .Label = c("A1", 
"A2", "A3", "A4", "B1", "B2", "B3", "B4", "C1", "C2"), class = "factor"), 
    v3 = structure(c(9L, 1L, 7L, 8L, 6L, 10L, 2L, 3L, 5L, 4L), .Label = c("-0.713778796788462", 
    "-1.08665755420174", "-2.20874190923613", "0.226184032935989", 
    "0.228687166237024", "0.641078999902449", "0.659864898007848", 
    "1.11077415422586", "1.30243501910073", "1.57605315010293"
    ), class = "factor"), v4 = structure(c(6L, 10L, 9L, 1L, 2L, 
    8L, 4L, 5L, 7L, 3L), .Label = c("-0.206875175346852", "-0.263652840400634", 
    "-0.563443803887212", "-0.605033653912397", "-1.10776531137661", 
    "-1.17580991422538", "-1.2693304626523", "-1.27119461040557", 
    "0.143314307415803", "0.388467088361395"), class = "factor")), class = "data.frame", row.names = c(NA, 
-10L))
...