2016-07-21 8 views
2

Ich habe eine einfache Datenrahmen, wie viele Spalten eines Datenrahmens zu transformieren in r

d <- data.frame(var1=c(5,5,5),var1_c=c(5,NA,6),var2 =c(6,6,6),var2_c = c(8,6,NA)) 

mit vielen Linien und eine Menge Variablen, die alle mit „varXXX“ und „varXXX_c“, und Ich möchte, dass es immer eine NA in einer varXXX_c gibt, um die NA durch den Wert in der Variablen varXXX zu ersetzen. Kurz , will ich tun:

d[is.na(d$var1_c),"var1_c"] <- d$var1[is.na(d$var1_c)] 

aber versuchen, einen besseren Weg zu finden, dies zu tun, die Paste kopieren und „1“ mit der Anzahl der Variablen zu ändern.

Ich würde lieber eine Lösung in der Basis R oder dplyr finden, wäre aber dankbar für jede Hilfe!

Antwort

2

Wir grep verwenden die Spaltennamen zu finden, die mit var gefolgt von Zahlen (\\d+), gefolgt von _ und gefolgt von c starten. Ähnlich haben wir einen anderen Satz von logischen Index für var gefolgt von einer oder mehreren Zahlen (\\d+) bis zum Ende der Zeichenfolge ($) und dann tun Sie die Teilmenge der Spalten auf der Grundlage des Index und ändern Sie die NA-Werte (is.na(d[i1])) entsprechende Elemente in 'd [i2] `.

i1 <- grepl("var\\d+_c", names(d)) 
i2 <- grepl('var\\d+$', names(d)) 
d[i1][is.na(d[i1])] <- d[i2][is.na(d[i1])] 

HINWEIS: Dies basiert auf der Annahme, dass die Spalten in der gleichen Reihenfolge sind.

+0

woah! Danke für diese schöne und effiziente Lösung! Das Problem für mich ist, dass mein Datenrahmen andere Variablen als die Variablen vom Typ varXXX/varXXX_c enthält und dass ich nicht sicher bin, wie die Spalten sortiert sind (und Ihre Lösung, korrigieren Sie mich, wenn ich falsch liege, hängt stark von dieser Bedingung ab) . – Malta

+0

@Malta Mache in diesem Fall einen zweiten Grep, d. H. 'I2 <- grepl ('var \\ d + $', Namen (d))' und verwende 'i2' – akrun

Verwandte Themen