2016-09-17 2 views
0

Ich habe posted my problem seit ein paar Monaten und denke, dass alles in Ordnung war, aber es scheint, dass nein. Und es tut mir leid für die vielen Beiträge.Gewichtung Daten - inkohärentes Ergebnis wieder

DF=structure(list(Age = c(16L, 29L, 22L, 64L, 42L, 46L, 30L, 37L, 31L, 52L, 44L, 54L, 23L, 22L, 42L, 39L, 39L, 51L, 25L, 64L, 55L, 56L, 27L, 31L, 39L, 22L, 54L, 33L, 34L, 18L, 39L, 41L, 52L, 41L, 27L, 36L, 64L, 42L, 21L, 44L, 50L, 35L, 22L, 65L, 53L, 18L, 25L, 59L, 56L, 52L, 39L, 40L, 25L, 63L, 43L, 23L, 52L, 48L, 24L, 45L, 27L, 42L, 56L, 43L, 28L, 51L, 54L, 16L, 65L, 56L, 47L, 45L, 29L, 41L, 52L, 50L, 26L, 44L, 35L, 55L, 57L, 43L, 52L, 28L, 33L, 20L, 39L, 15L, 55L, 20L, 30L, 10L, 54L, 51L, 47L, 36L, 42L, 33L, 26L, 29L, 19L, 22L, 22L, 22L, 40L, 33L, 20L, 43L, 53L, 25L, 25L, 49L, 25L, 31L, 45L, 51L, 60L, 54L, 20L, 25L, 60L, 48L, 35L, 42L, 14L, 28L, 55L, 20L, 35L, 17L, 46L, 20L, 45L, 37L, 33L, 36L, 60L, 47L, 27L, 25L, 51L, 32L, 19L, 25L, 19L, 60L, 18L, 17L, 33L, 26L, 33L, 32L, 33L, 22L, 17L, 24L, 43L, 38L, 27L, 40L, 42L, 41L, 31L, 43L, 34L, 33L, 42L, 37L, 24L, 50L, 53L, 35L, 50L, 37L, 46L, 39L, 33L, 56L, 58L, 23L, 31L, 52L, 50L, 33L, 56L, 55L, 20L, 22L, 44L, 50L, 30L, 58L, 59L, 16L, 33L, 53L, 50L, 20L, 31L, 22L, 38L, 59L, 38L, 62L, 52L, 30L, 18L, 53L, 38L, 41L, 44L, 53L, 19L, 53L, 57L), 
    Sous_Categorie = c("7", "7", "7", "7", "7", "7", "7", "7", 
    "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", 
    "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", 
    "7", "7", "7", "7,9", "8", "8", "8", "8", "8", "9", "9", 
    "11", "10,7", "10,8,9", "7", "7", "7", "7", "7", "7,8", "8", 
    "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "8", 
    "11", "7", "12", "12", "12", "12", "12", "12", "12", "12", 
    "12", "12", "12", "12", "12", "12", "12", "12", "13", "13", 
    "13", "13", "13", "14", "14", "14", "14", "14", "14", "14", 
    "14", "14", "14", "14", "14", "14", "14", "14", "14", "14", 
    "14", "14", "14", "15", "15", "15", "15", "15", "17", "17", 
    "17", "17", "17", "17", "17", "17", "17", "17", "17", "17", 
    "17", "17", "17", "17", "17", "17", "17", "17", "17", "17", 
    "17", "17", "17", "17", "17", "17", "17", "17", "17", "17", 
    "17", "17", "17", "17", "17", "17", "17", "17", "17", "17", 
    "17", "17", "17", "17", "17", "17", "17", "17", "17", "17", 
    "17", "17", "17", "17", "17", "17", "17", "17", "17", "17", 
    "17", "17", "17", "17", "17", "17", "17", "17", "17", "17", 
    "17", "17", "17", "17", "17", "18", "18", "18", "7,12", "7,12", 
    "7,12", "7,12", "7,13,17", "7,16", "7,17", "7,17", "7,17", 
    "7,17", "7,17", "8,17", "8,17", "11,17", "7,17", "7,17", 
    "8,17", "7,17", "7,17", "12,14", "12,15", "17,18")), .Names = c("Age", "Sous_Categorie"), row.names = c(NA, -215L), class = "data.frame") 

Und hier die vorgeschlagene und akzeptierte Lösung:

cat_perc <- function(vec) { 
    # percentages 
    nums <- table(as.numeric(unlist(strsplit(vec, ',')))) 
    perc <- nums/sum(nums) 
    final <- perc * length(vec) 
    return(final) 
} 

    cat_perc(DF$Sous_Categorie) 

Ich habe gerade Ergebnisse überprüft, ich verwende dieses Skript seit vielen Wochen, aber was mir aufgefallen ist, dass Gewichtung falsch zu sein scheint : Das Ziel war, 1 zu vergeben, wenn es keine Kombination gibt, und wenn die Kombination durch Komma getrennt ist: 1,3, wird es 0,5, 0,5 für jeden sein, für die Kombination solcher 1,2,3 wird es 1/3 sein , 1/3, 1/3. Ich habe manuell für 7 überprüft, dieses Skript zeigt mir an, dass ich 61.9341564 habe, während ich manuell habe: 52 * 1 + 0.5 * 17 + (1/3 * 1) = 60.83333, wo ist das Problem :(? Danke

+0

Warum würden Sie nicht den Mann fragen, wer sie beantwortet? –

+1

@alistaire Bitte überprüfen Sie diese Frage –

+0

Da dieses Skript durch zwei Beiträge erstellt wurde .. Gibt es eine andere einfachste Lösung? Es tut mir leid für das .. – ranell

Antwort

0

Schließlich dank vieler Beiträge von Stackoverflow ich den folgenden Code haben:

library(dplyr) 
library(reshape2) 
datas=DF 

cat_perc <- function(vec) { 
# split strings 
L <- lapply(vec,function(v) strsplit(as.character(v),',')) 
# generate all combinations of products 
d <- mapply(expand.grid,L,SIMPLIFY = F,stringsAsFactors=F) 
proportion <- melt(d,id.vars=c('Var1')) %>% # convert to long format 
    group_by(L1) %>% 
    mutate(weight=1/n()) %>%    # calculate weights 
    group_by(Var1) %>%    # 
    summarize(sm=sum(weight))  
proportion=t(proportion) 
colnames(proportion)=proportion[1,] 
proportion=proportion[-1,] 
return(proportion) 
} 

cat_perc(DF$Sous_Categorie) 

Das Gewicht scheint in Ordnung zu sein Problem, die bleiben:.. umformen die drei letzten Zeile nicht in Ordnung ist und ich don weiß nicht, wie man das gleiche Format als initial_function erhält

Dies ist der Ausgang:

output= structure(c(" 0.8333333", " 2.5000000", "19.0000000", " 5.3333333", 
"20.5000000", " 5.5000000", " 0.5000000", "84.3333333", " 3.5000000", 
"60.8333333", " 9.3333333", " 2.8333333"), .Names = c("10", "11", 
"12", "13", "14", "15", "16", "17", "18", "7", "8", "9")) 

brauche ich das Format/Klasse von output als die Ausgabe von initial_function:

initial_function=structure(c(61.9341563786008, 10.6172839506173, 3.53909465020576, 
1.76954732510288, 2.65432098765432, 19.4650205761317, 5.30864197530864, 
18.5802469135802, 5.30864197530864, 0.88477366255144, 81.3991769547325, 
3.53909465020576), class = "table", .Dim = 12L, .Dimnames = structure(list(
    c("7", "8", "9", "10", "11", "12", "13", "14", "15", "16", 
    "17", "18")), .Names = "")) 

Dank

Verwandte Themen