2016-04-15 7 views
2

Ich versuche, die Daten mit einigen Bedingungen umzuformen. Die Daten werden wie folgt sein. so wird es mehr ID sein, die sich wiederholenDaten umformen mit Bedingungen in R

S.No  Count ID  Type 
    1   135 350  A 
    2   114 350  A 
    3   84 350  A 
    4   80 350  A 
    5   19 350  A 
    6   8 350  A 
    7   21 350  A 
    8   88 350  B 
    9  111 350  B 
    10  46 350  B 
    11  108 350  B 
    12  19  352  A 
    13  117 352  A 
    14  167 352  B 

Und ich muss es wie unten konvertieren.

S.No ID Type Count_type B Count_typeA_less than  Count_typeA 
             max(count_type B)  high than 
                  max(count_type B) 
1  350 B  88,111,46,108  84,80,19,8,21    135,114 
2  352 B  167     19,117      NA 

Count_typeA_Less als max (count_type B) = count vom Typ A, der als maximale Anzahl weniger sind count_type B
Count_typeA_high als max (count_type B) = count vom Typ A, die höher sind als die maximale anzahl von count_type B

habe ich mit dem dplyr versucht und umformen. Das konnte ich nicht erreichen. Bitte leitet mich für die oben beschriebene Situation in R.

+0

Es ist nicht klar, welche Art von Struktur sollte Ihre Ausgabe sein? Ist es ein Datenrahmen? Und wenn ja, gibt es einen einzelnen Wert "88, 111, 46, 108" kombiniert oder sollten dies vier Fälle (vier separate Werte) sein? Oder ist es ausreichend, nur eine zusätzliche Variable zu haben, die für jede Zeile angibt, ob "Zählertyp A" kleiner oder größer als "max (Zählertyp B)" ist? (Und was ist, wenn Zählertyp A Zählertyp B entspricht)? – Daniel

+0

Danke Daniel, für deine Antwort. Ja, ich brauche einen Datenrahmen. Die Daten, die ich habe, haben 1000 Beobachtungen mit unterschiedlichen IDs. Zweitens brauche ich es als einen einzelnen Wert, wo die Anzahl durch Komma getrennt werden soll. Schließlich, wenn Zählertyp A gleich Zählertyp B ist, dann eine separate Spalte, die die Zählung zeigt, die gleich ist (wiederum sollte dies ein einzelner Wert sein) – ssan

+0

ok, also müssen diese Spalten Zeichenvektoren sein? Z. B. ist der erste Wert in der Spalte ** Count_typeA_less als max (Count B) ** "88, 111, 46, 108"? – Daniel

Antwort

1

Die folgende scheint im Wesentlichen zu tun, was Sie fragen:

library(data.table) 
setDT(mydf) 

mydf[, list(type_B = toString(Count[Type == "B"]), 
      type_A_lt_mB = toString(Count[Type == "A" & Count < max(Count[Type == "B"])]), 
      type_A_gt_mB = toString(Count[Type == "A" & Count > max(Count[Type == "B"])])), ID] 
##  ID   type_B  type_A_lt_mB type_A_gt_mB 
## 1: 350 88, 111, 46, 108 84, 80, 19, 8, 21  135, 114 
## 2: 352    167   19, 117 

Hier ist der Ausgang data.frame ich verwenden:

mydf <- structure(list(Count = c(135L, 114L, 84L, 80L, 19L, 8L, 21L, 
    88L, 111L, 46L, 108L, 19L, 117L, 167L), ID = c(350L, 350L, 350L, 
    350L, 350L, 350L, 350L, 350L, 350L, 350L, 350L, 352L, 352L, 352L 
    ), Type = c("A", "A", "A", "A", "A", "A", "A", "B", "B", "B", 
    "B", "A", "A", "B")), .Names = c("Count", "ID", "Type"), row.names = c(NA, 
    14L), class = "data.frame") 

I entfernt die Spalte "S.no", weil sie für die Frage völlig irrelevant ist.