2016-11-08 9 views
0

Wie kann ich Spalten eines Datenrahmens in der folgenden Weise kombinieren?R (dplyr, tidyr): kombinieren/aggregieren verwandte Spalten

data <- data.frame(user.A = c(2,4,6), 
       user.B = c(11,13,15), 
       other.A = c(102,104,106), 
       other.B = c(201,103,105), 
       id = c('001', '004', '006')) 
data 
    user.A user.B other.A other.B id 
1  2  11  102  201 001 
2  4  13  104  103 004 
3  6  15  106  105 006 

# Desired output. 
    user other id 
1 2 102 001 
2 11 201 001 
3 4 104 004 
4 13 103 004 
5 6 106 006 
6 15 105 006 

Ich glaube, dies mit dyplr oder tidyr getan werden kann. Die bind_rows-Funktion in dplyr macht etwas ähnliches, aber erzeugt diese gewünschte Ausgabe nicht.

Antwort

2

Es ist viel einfacher mit melt von data.table, da es mehrere measurepatterns dauern kann.

library(data.table) 
melt(setDT(data), measure = patterns("^user", "^other"), 
     value.name = c("user", "other"))[, variable := NULL][] 
# id user other 
#1: 001 2 102 
#2: 004 4 104 
#3: 006 6 106 
#4: 001 11 201 
#5: 004 13 103 
#6: 006 15 105 

Als 'Benutzer', 'andere' Spalten sind numeric, können wir können gather/spread von tidyr

library(dplyr) 
library(tidyr) 
gather(data, var, val, -id) %>% 
     separate(var, into = c("var1", "var2")) %>% 
     spread(var1, val) %>% 
     select(-var2) 
# id other user 
#1 001 102 2 
#2 001 201 11 
#3 004 104 4 
#4 004 103 13 
#5 006 106 6 
#6 006 105 15 
2

Sie eine Variation der wie folgt verwenden auch reshape Funktion:

new_data <- reshape(data, varying = 1:4, direction = "long") 

Das varying Argument wird verwendet d um anzugeben, auf welchen Spalten geschwenkt werden soll.

+0

Für all die Hassbasis, die 'shape()' bekommt, ist es manchmal ziemlich clever. – thelatemail

Verwandte Themen