2017-10-11 1 views
1

Dies ist die Erweiterung here.
Daten wie folgt aussehen:Anzahl nach Ebenen in mehreren Spalten

ID Type Problem1 Value1  Problem2 Value2 Problem3 Value3 
1 A  X   500  Y   1000  Z   400 
2 A  X   600  Z   700  
3 B  Y   700  Z   100 
4 B  W   200  V   200 
5 C  Z   500  V   500  
6 C  X   1000  W   100  V   900 

Das Ergebnis, das ich will, ist:

Type X  Y  Z  W  V 
A  2  1  2  0  0 
B  0  1  1  1  1 
C  1  0  1  1  2 

Ich will die Nummer unter jeder Gruppe zählen, wie kann ich tun?

# data 
dt <- fread(" 
ID Type Problem1 Value1  Problem2 Value2 Problem3 Value3 
1 A  X   500  Y   1000  Z   400 
2 A  X   600  Z   700  
3 B  Y   700  Z   100 
4 B  W   200  V   200 
5 C  Z   500  V   500  
6 C  X   1000  W   100  V   900", fill = T) 

ich versuchen, dieses:

dcast(melt(dt, measure = patterns("^Value", "^Problem"), 
     value.name = c("Value", "Problem"))[Problem != "" 
     ][, Problem := factor(Problem, levels = c("X", "Y", "Z", "W", "V"))], 
     Type ~Problem, value.var = "Value", sum/mean, na.rm = TRUE) 

aber es hat den Fehler.

Antwort

3

ich es in der langen Form speichern würde (ähnlich den Versuch des OP) ...

dt[Problem3 == "", Problem3 := NA] 
mDT = melt(dt, 
    id = c("ID", "Type"), 
    meas = patterns("Problem", "Value"), 
    variable.name = "Item", 
    value.name = c("Problem", "Value"), 
    na.rm = TRUE 
) 

    ID Type Item Problem Value 
1: 1 A 1  X 500 
2: 2 A 1  X 600 
3: 3 B 1  Y 700 
4: 4 B 1  W 200 
5: 5 C 1  Z 500 
6: 6 C 1  X 1000 
7: 1 A 2  Y 1000 
8: 2 A 2  Z 700 
9: 3 B 2  Z 100 
10: 4 B 2  V 200 
11: 5 C 2  V 500 
12: 6 C 2  W 100 
13: 1 A 3  Z 400 
14: 6 C 3  V 900 

Dann einfach es ist Gießen zu breit:

dcast(mDT, Type ~ Problem, fun.agg = length) 

    Type V W X Y Z 
1: A 0 0 2 1 2 
2: B 1 1 0 1 1 
3: C 2 1 1 0 1 

Wenn Sie wollen e Spalten in einer bestimmten Reihenfolge wollen oder unbeobachtet Ebenen Problem enthält, können Sie einen Faktor verwenden (wie die OP tat):

dcast(mDT, Type ~ factor(Problem, levels=c("X","Y","Z","W","V")), fun.agg = length) 

# or more permanently 

mDT[, Problem := factor(Problem, levels=c("X","Y","Z","W","V"))] 
dcast(mDT, Type ~ Problem, fun.agg = length) 
+1

ich diesen 'bekam Mit‚Problem‘als Wertspalte. Verwenden Sie 'value.var' zum Überschreiben Fehler in make.unique (sapply (unlist (lvar), all.vars, max.names = 1L),: 'sep' muss eine Zeichenfolge sein ' –

+0

@PeterChen Hm, I Ich bin mir nicht sicher, warum das passieren würde. Ist es für dieses Beispiel oder ein anderes? Da jemand Ihren Kommentar upvotiert hat, denke ich, dass es ein Problem mit der data.table-Version sein könnte. Ich teste am 1.10.4 (was war die letzte Version auf CRAN bis letzte Woche) und sah es funktioniert. – Frank

2

können Sie versuchen, eine dplyr Lösung:

library(tidyverse) 
dt %>% 
    select(Type, starts_with("Problem")) %>% 
    gather(key, value, -Type) %>% 
    group_by(Type) %>% 
    filter(!value=="") %>% 
    count(value) %>% 
    spread(value, n, fill = 0) 
# A tibble: 3 x 6 
# Groups: Type [3] 
    Type  V  W  X  Y  Z 
* <chr> <dbl> <dbl> <dbl> <dbl> <dbl> 
1  A  0  0  2  1  2 
2  B  1  1  0  1  1 
3  C  2  1  1  0  1 
2
# data 
dt <- fread(" 
      ID Type Problem1 Value1  Problem2 Value2 Problem3 Value3 
      1 A  X   500  Y   1000  Z   400 
      2 A  X   600  Z   700  
      3 B  Y   700  Z   100 
      4 B  W   200  V   200 
      5 C  Z   500  V   500  
      6 C  X   1000  W   100  V   900", fill = T) 

dt <- dt[,c("Type", "Problem1", "Problem2", "Problem3")] 
dt <- melt(dt, id = "Type") 
cnt <- dt[,.(freq = .N), by = .(Type, value)] 

mat <- reshape(cnt, idvar = "Type", timevar = "value", direction = "wide") 
> mat 
    Type freq.X freq.Y freq.W freq.Z freq.V freq. 
1: A  2  1  NA  2  NA  1 
2: B  NA  1  1  1  1  2 
3: C  1  NA  1  1  2  1 
Verwandte Themen