2016-10-21 2 views
0

Hier ist die Herausforderung, vor der ich mich stelle. Ich versuche, diesen DatensatzDatenstruktur von Spalten in Zeilen umformen und Zellenwerte reduzieren

a b  c 
    100 0  111 
    0 137 17 
    78 117 91 

in (Spalte Zeilen)

col1 col2 
    a  100,78 
    b  137,117 
    c  111,17,91 

ich mich kann dies mit reshape oder melt Funktion kennen zu verwandeln tun, aber ich bin nicht sicher, wie die Zelle kollabieren und Einfügen Werte. Irgendwelche Vorschläge oder Hinweise sind Leute geschätzt.

Antwort

1

Ich würde dplyr statt Umformen verwenden.

library(dplyr) 
library(tidyr) 

Data <- data.frame(a=c(100,0,78),b=c(0,137,117),c=c(111,17,91)) 

Data %>% 
    gather(Column, Value) %>% 
    filter(Value != 0) %>% 
    group_by(Column) %>% 
    summarize(Value=paste0(Value,collapse=', ')) 

Die Funktion melt in reshape ähnlich ist, sammeln. Die group_by Funktion teilt später Funktionen, die Sie basierend auf Werten in Column trennen möchten. Schließlich berechnet summarize die Zusammenfassung, die wir für jede der Gruppen haben wollen. Fügen Sie in diesem Fall alle Begriffe zusammen ein.

Welche sollten Sie geben:

# A tibble: 3 × 2 
    Column  Value 
    <chr>  <chr> 
1  a  100, 78 
2  b 137, 117 
3  c 111, 17, 91 
+0

dies funktioniert. Vielen Dank :) –

2

Hier ist eine leichte Option toString() Methode jede Spalte in eine Zeichenfolge kollabieren und mit stack() die Ergebnisliste auf die gewünschte Ausgabe neu zu gestalten:

stack(lapply(df, function(col) toString(col[col!=0]))) 

#  values ind 
#1  100, 78 a 
#2 137, 117 b 
#3 111, 17, 91 c 
0

Mit library(data.table)

melt(dt)[, .(value = paste(value[value !=0], collapse=', ')), by=variable] 
# variable  value 
# 1:  a  100, 78 
# 2:  b 137, 117 
# 3:  c 111, 17, 91 

Die Daten:

dt = fread("a b  c 
100 0  111 
0 137 17 
78 117 91")