2017-09-27 6 views
-1

Ich versuche, mehrere Spalten zu kombinieren, die fehlende Variablen haben werden. Ich bin sehr neu in R und habe eine Menge Probleme damit. Zum Beispiel, ich versuche, dies zu machen:Kombinieren mehrerer Spalten mit fehlenden Variablen

ID A  B  A  D 
1 fill NA  NA Market 
2 NA Ball fill NA 
3 NA NA  NA Market 
4 fill Ball NA NA 

In diesem:

ID A  B  D 
1 fill NA Market 
2 fill Ball NA 
3 NA NA Market 
4 fill Ball NA 

ich Probleme, weil die Datenbank ~ 1500 Spalten hat, mit vielen dupliziert Spaltennamen. Ich habe versucht, Schmelze und Groupby, aber ich konnte es nicht zum Laufen bringen. Wo auch immer die Spalte dupliziert wird, und wenn sie einen Wert hat, wird die Spalte mit dem gleichen Namen keinen Wert haben, wenn das sinnvoll ist. Ich weiß nicht, wie man die Funktionen zum Funktionieren bringt, ohne die Datenbank durchzugehen und die 50 oder so duplizierten Spalten zu identifizieren (wie in 25 Spalten ein Duplikat). Es kann auch Spalten geben, die wie in drei Spalten von A Triplets enthalten, aber niemals überlappende Werte.

+2

Ich denke, dass in R, Ihre Spalten nicht den gleichen Namen präsentieren können, so vielleicht hast du 'A' und' A.1' oder so, oder? – R18

+1

Nein, sie haben denselben Namen, da diese Spalten aus der Spread-Funktion erstellt werden, die auf mehrere Variablen wirkt. – rss1080

Antwort

1

können Sie versuchen,

# your data 
d <- read.table(text="ID A  B  A  D 
1 fill NA  NA Market 
      2 NA Ball fill NA 
      3 NA NA  NA Market 
      4 fill Ball NA NA", header=T) 
d 
ID A B A.1  D 
1 1 fill <NA> <NA> Market 
2 2 <NA> Ball fill <NA> 
    3 3 <NA> <NA> <NA> Market 
4 4 fill Ball <NA> <NA> 

Wie Sie dupliziert COLNAMES mit .n In der getaggt werden sehen follwing wir werden die Namen mutieren, so dass sie wieder stringi dupliziert verwenden, dann tidyverse Verbreitung mit:

library(tidyverse) 
library(stringi) 
d %>% 
    gather(key, value, -ID) %>% 
    mutate(key2=stri_extract_first_words(key)) %>% 
    filter(!is.na(value)) %>% 
    select(ID, key2, value) %>% 
    spread(key2, value) 
    ID A B  D 
1 1 fill <NA> Market 
2 2 fill Ball <NA> 
3 3 <NA> <NA> Market 
4 4 fill Ball <NA> 
+0

Wenn ich das also richtig verstehe und mich korrigiere, wenn ich falsch liege, weil ich sehr neu in R bin, müsste ich für jede doppelte Spalte neue Instanzen davon haben? Gibt es eine Möglichkeit, dies zu automatisieren, so dass es automatisch erkennt, welche Spalten doppelt vorhanden sind? Ich könnte mich irren mit meinem Verständnis. – rss1080

+0

Sorry, ich verstehe nicht. Bitte überarbeiten Sie Ihre Frage und fügen Sie einige Daten zu Ihrem Problem hinzu. – Jimbou

0

Sie könnten split.default der Basis R verwenden, um data.frame basierend auf ähnlichen Spaltennamen aufzuteilen und die Daten für jede Untergruppe zusammenzuführen. Sie können zusätzlichen Schritt zu tun haben Recht, die Spaltenreihenfolge zu erhalten, wenn das wichtig ist

data.frame(lapply(split.default(df, names(df)), 
        function(x) x[cbind(1:NROW(x), max.col(!is.na(x)))])) 
#  A B  D ID 
#1 fill <NA> Market 1 
#2 fill Ball <NA> 2 
#3 <NA> <NA> Market 3 
#4 fill Ball <NA> 4 

DATA

df = structure(list(ID = 1:4, A = structure(c(1L, NA, NA, 1L), .Label = "fill", class = "factor"), 
    B = structure(c(NA, 1L, NA, 1L), .Label = "Ball", class = "factor"), 
    A = structure(c(NA, 1L, NA, NA), .Label = "fill", class = "factor"), 
    D = structure(c(1L, NA, 1L, NA), .Label = "Market", class = "factor")), .Names = c("ID", 
"A", "B", "A", "D"), class = "data.frame", row.names = c(NA, 
-4L)) 
Verwandte Themen