2016-05-13 7 views
1

Ich habe einige Daten bezüglich Trennung in x und y als eine Funktion der Zeit. Es kann (mit x==y Diagonale) in y oder beides in x, nur nur eine Trennung sein:Kollaps Spalten in eins, Entfernen NA, Funktion, wenn beide nicht NA

data 
# Source: local data frame [307 x 4] 

#    t0   t1    x    y 
# 1 1449241093 1449241345   NA 4.085057e-02 
# 2 1449241345 1449241537   NA 4.085057e-02 
# ... 
# 7 1449242375 1449242627 4.085057e-02   NA 
# 8 1449242627 1449242818 4.085057e-02   NA 
# ... 
# 78 1449245524 1449246079 0.000000e+00 0.000000e+00 
# 79 1449246079 1449246101 -2.042528e-01 -2.042528e-01 
# ... 

Ich möchte dies in dieses Format bringen:

# Source: local data frame [307 x 4] 

#   t0   t1 direction separation 
# 1 1449241093 1449241345   Y 4.085057e-02 
# 2 1449241345 1449241537   Y 4.085057e-02 
# ... 
# 8 1449242627 1449242818   X 4.085057e-02 
# 9 1449242818 1449242949   X 4.085057e-02 
# ... 
# 78 1449245524 1449246079  D 0.000000e+00 
# 79 1449246079 1449246101  D 2.888571e-01 
# ... 

Derzeit bin ich tut dies mit Code wie folgt:

data %>% mutate(direction=ifelse(is.na(x),"Y", ifelse(is.na(y),"X","D")), 
       separation=ifelse(is.na(x),y, ifelse(is.na(y),x, sqrt(x**2 + y**2))) %>% 
     select(data,-x,-y) 

Meine Frage: gibt es eine schönere Art und Weise t zu tun sein Verwenden tidyr::gather()?

Dies würde für den Diagonale Fall schön, wenn nicht, wo ich mehrere Zeilen bekommen (natürlich, weil sie sammeln nicht gesagt, wie diese Fälle behandeln):

gather(data,direction,separation,x,y, na.rm=T) %>% arrange(t0) 
# Source: local data frame [396 x 4] 

#    t0   t1 direction separation 
# 1 1449241093 1449241345   y 4.085057e-02 
# 2 1449241345 1449241537   y 4.085057e-02 
# ... 
# 7 1449242375 1449242627   x 4.085057e-02 
# 8 1449242627 1449242818   x 4.085057e-02 
# ... 
# 77 1449245524 1449246079   x 0.000000e+00 
# 78 1449245524 1449246079   y 0.000000e+00 
# 79 1449246079 1449246101   x -2.042528e-01 
# 80 1449246079 1449246101   y -2.042528e-01 
# ... 

Grundsätzlich, was ich brauche eine erweiterte Version von How to collapse many records into one while removing NA values

+0

Sie könnten 'distinct' nach' gather' verwenden, um nur die Zeilen mit nicht duplizierten Werten von 't0' und' t1' zu behalten, dh '%>% distinct (t0, t1)' unter der Annahme 't0' und "t1" sind eindeutige Bezeichner von Zeilen. – aosmith

Antwort

1

bin ich nicht sicher, ob dies auf explizite ifelse vorzuziehen ist, aber hier geht:

library(data.table) 

setDT(df)[!is.na(x) | !is.na(y), .(t0, t1, 
       direction = c('X', 'Y', 'D')[((!is.na(.SD)) %*% c(1, 2))], 
       separation = sqrt(rowSums(.SD^2, na.rm = T))) 
      , .SDcols = x:y] 

Übersetzung an dplyr ist dem Leser überlassen.

+1

Ich bekomme diesen Fehler, indem ich versuche, es zu benutzen: '' 'Fehler in' [.tbl_df' (setDT (Schritte),,. (T0, t1, Richtung = c ("X", "Y",: Unbenutztes Argument (.SDcols = x: y) '' ' – Graipher

+0

klingt, als wäre es aus irgendeinem Grund keine' data.table' geworden - ich kann vorschlagen, auf die neueste Version von 'data.table' zu ​​aktualisieren, und wenn das nicht hilft versuche 'as.data.table' anstelle von' setDT' – eddi

+0

Hm, ich habe es gerade so ausprobiert: ''>> df <- as.data.table (steps) '' ' ' '> setDT (df) [,. (t0, t1, Richtung = c ('X', 'Y', 'D') [((! is.na (.SD))% *% c (1, 2))], trennung = sqrt (rowSums (.SD^2, na.rm = T))), .SDcols = x: y] Fehler in '[.tbl_df' (setDT (df),,. (t0, t1, direction = c ("X", "Y", "D") [((! is.na (.SD))% *%: unbenutztes Argument (.SDcols = x: y) '' ' – Graipher

Verwandte Themen