2014-12-03 10 views
5

Problem z tym, jak obliczyć kod następujący zestaw danych.Przesyłanie unikatowych funkcji w kolumnach do nazw zmiennych i oryginalnych kodowań oryginalnych funkcji do zmiennych w R

przykład dane, powiedzmy dataframe = MYDATA:

ID |  NAMES  | 
-- | -------------- | 
1 | 4444, 333, 456 | 
2 | 333   | 
3 | 456, 765  | 

ja jak przesyłać tylko te unikalne zmienne nazwy, jak i kodu zmiennych kolumny, jeśli każdy rząd jest zmienna lub nie, czyli jeden lub 0

Pożądany wyjściowa:

ID |  NAMES  | 4444 | 333 | 456 | 765 | 
-- | -------------- |------|-----|-----|-----| 
1 | 4444, 333, 456 | 1 | 1 | 1 | 0 | 
2 | 333   | 0 | 1 | 0 | 0 | 
3 | 456, 765  | 0 | 0 | 1 | 1 | 

co robiłem do tej pory jest tworzony wektor unikalnych

split <- str_split(string = mydata$NAMES,pattern = ",") 

vec <- unique(str_trim(unlist(split))) 
remove <- "" 
vec <- as.data.frame(vec[! vec %in% remove]) 
colnames(vec) <- "var" 
vecRef <- as.vector(vec$var) 

namesCast <- dcast(data = vec,formula = .~var) 
namesCast <- nameCast[,2:ncol(namesCast)] 

Daje to wektor unikatowych NAMES z usuniętymi odstępami/nieregularnościami. Stamtąd nie mam pojęcia, jak zrobić kodowanie pasujące/dummy, więc każda pomoc będzie bardzo ceniona!

Odpowiedz

5

Można użyć cSplit_e z mojego pakietu „splitstackshape”, tak:

library(splitstackshape) 
cSplit_e(mydata, "NAMES", sep = ",", type = "character", fill = 0) 
# ID   NAMES NAMES_333 NAMES_4444 NAMES_456 NAMES_765 
# 1 1 4444, 333, 456   1   1   1   0 
# 2 2   333   1   0   0   0 
# 3 3  456, 765   0   0   1   1 

Jeśli chcesz zobaczyć podstawową funkcję, która jest wywoływana podczas korzystania z tych argumentów, można spojrzeć na splitstackshape:::charMat, który trwa a list wygenerowany przez strsplit i tworzy z niego matrix.

Wywołanie funkcji bezpośrednio dałby ci coś takiego:

splitstackshape:::charMat(
    lapply(strsplit(as.character(mydata$NAMES), ","), 
     function(x) gsub("^\\s+|\\s$", "", x))) 
#  333 4444 456 765 
# [1,] 1 1 1 NA 
# [2,] 1 NA NA NA 
# [3,] NA NA 1 1 
+0

Ha wiedziałem, że ktoś po prostu powrót z jednej linii kodu, który wieje zdanie. Dzięki to działa świetnie! – moku

Powiązane problemy