2016-11-29 3 views
0

Diese Frage ähnelt früheren Fragen (basierend auf meiner Suche), aber mit einer Wendung. Ich hoffe, [s, l, v] anzuwenden, um diese Aktion für Effizienz durchzuführen.R - Neue Spalte basierend auf vorherigen Spalten, für mehrere ähnliche Variablen

df <- data.frame(id = c(1,2,3,1,2), var1_dose_v1 = c(2,4,NA,1,NA), 
      var1_dose_v2 = c(NA,NA,4,NA,3), 
      var2_dose_v1 = c(NA,4,2,3,5), 
      var2_dose_v2 = c(1,NA,NA,NA,NA), 
      var3_dose_v1 = c(NA,NA,2,3,5), 
      var3_dose_v2 = c(1,4,NA,NA,NA))) 

die wie folgt aussieht unten

id var1_dose_v1 var1_dose_v2 var2_dose_v1 var2_dose_v2 var3_dose_v1 var3_dose_v2 
1   2   NA   NA   1   NA   1 
2   4   NA   4   NA   NA   4 
3   NA   4   2   NA   2   NA 
1   1   NA   3   NA   3   NA 
2   NA   3   5   NA   5   NA 

Ich möchte eine neue Funktion erstellen, die Informationen aus der Version 1 (v1) und Version 2 (v2) jedes var # amalgamiert, die Ausgabe erzeugt unten.

Es ist wichtig für mich zu verwenden, da es Tausende von Var # s gibt.

Danke für Ihre Hilfe!

+0

beantwortet es Ihre Frage? Mind http://StackOverflow.com/Help/Someone-answers –

Antwort

0

this-

df[is.na(df)] <- 0 
new_df <- sapply(seq(1:((ncol(df)-1)/2)), function(x) 
      { 
      df[, paste0("var",x,"_dose_v1")] + df[, paste0("var",x,"_dose_v2")] 
      }) 
+0

Was ist, wenn es 3 Dosen für einige Variablen und 2 für andere gibt? –

+0

Der Einfachheit halber ist die Lösung nicht verallgemeinert und auf die Anforderungen der Frage beschränkt. Sie haben recht, das wird nicht funktionieren, wenn es unterschiedliche Anzahl von Versionen für die Dosen gibt –

0
func <- function(i){ 
    col <- paste0("var",i,"_dose") 
    xx <- colnames(df)[grep(col, colnames(df))] 
    yy <- rowSums(df[xx], na.rm = TRUE) 
} 
l = lapply(1:((dim(df)[2]-1)/2) , func) 

df1 = as.data.frame(l) 
colnames(df1) <- paste0("var",1:((dim(df)[2]-1)/2),"_dose") 

# > df1 
# var1_dose var2_dose var3_dose 
# 1   2   1   1 
# 2   4   4   4 
# 3   4   2   2 
# 4   1   3   3 
# 5   3   5   5 

Wenn die 2-Versionen werden immer nebeneinander gehen zu sein: dann concised Version meines Code könnte

l = lapply(1:((dim(df)[2]-1)/2), 
    function(i) rowSums(df[colnames(df)[c(i*2,i*2+1)]], na.rm = T)) 
df1 = as.data.frame(l) 
colnames(df1) <- paste0("var",1:((dim(df)[2]-1)/2),"_dose") 
0

sein ein haben, Lösung, die für eine beliebige Anzahl von Variablen oder Dosen allgemein ist, gibt es eine neue Funktion von dplyr genannt "Coalesce" für diese gebaut:

library(dplyr) 
grps <- unique(sub("_v.*$?", "", names(df)[-1])) 
mat <- sapply(grps, function(g) { 
    do.call("coalesce", unname(as.list(df[grep(g, names(df))]))) 
}) 
df2 <- data.frame(id=df$id, mat) 
# id var1_dose var2_dose var3_dose 
# 1 1   2   1   1 
# 2 2   4   4   4 
# 3 3   4   2   2 
# 4 1   1   3   3 
# 5 2   3   5   5 
Verwandte Themen