2013-03-02 11 views
9

dobry,Zwraca charakteru związanego z określonym kodzie ASCII w R

Próbuję utworzyć iloczyn kartezjański w R z liter alfabetu.

Co ja rzeczywiście próbuje to:

Najpierw utworzyć macierz z literami

a <- as.matrix(seq(97,122,by=1)) 

Potem utworzyć ramkę danych z 2 kolumn ze wszystkimi kombinacjami

b <- expand.grid(a, a) 

Wreszcie łączę 2 kolumny

apply(b,1,paste,collapse=" ") 

Problem polega na tym, że nie mogę znaleźć sposobu na przekształcenie tych "dziesiętnych" w swoją postać z Ascii.

Próbowałem kilku rzeczy, takich jak rawToChar i gsub bezskutecznie.

Czy ktoś może wskazać mi właściwy kierunek?

Dzięki

+1

dlaczego nie używasz bezpośrednio 'liter'? – Arun

Odpowiedz

2

Pierwsza metoda bezpośrednia:

res <- do.call(paste, expand.grid(letters, letters)) 

Jeśli masz jakieś inne wartości ASCII i chcesz uzyskać równoważne znaki:

val <- 65:96 # whatever values you want the equivalent characters for 
mode(val) <- "raw" # set mode to raw 
# alternatively, val <- as.raw(65:96) 
a <- sapply(val, rawToChar) 
res <- do.call(paste, expand.grid(a, a)) 
+1

To działa świetnie Arun. Wielkie dzięki! – Diego

+1

Spróbuj unikać wywoływania zmiennej 'c' chociaż. – Dason

+0

@Dason, tak. dzięki za wskazanie. Edytowałem. – Arun

1

Aby wydrukować char ASCII w R można użyć funkcji print z backslashem \ przed numerem kodu ASCII. Na przykład, aby wydrukować odpowiednik znaku 150, użyj print("\150").

Albo dla powyższego przykładu można spróbować:

a <- sapply(97:122,function(x) rawToChar(as.raw(x))) 

b <- expand.grid(a,a) 

c <- t(apply(b,1,function(x) paste(x[1],x[2]))) 
+0

Dziękuję Gary. Nie, potrzebuję "zamieniać" wartości numeryczne w ramce danych na odpowiadające im litery, aby można je było używać wewnątrz kodu. Dzięki jeszcze raz. – Diego

+0

Zgadzam się z @Arun, że łatwiej jest po prostu użyć 'letters', ale zaktualizuję mój przykład tym, co powiedziałeś. –

+0

Dziękuję Gary. Próbowałem tego, ale nie robi tego, czego potrzebuję. Zwraca 2 zmienne, ale nie ich iloczyn kartezjański. – Diego

14

Bardzo prostym sposobem zwracania znaku na podstawie jego kodu ASCII jest funkcja intToUtf8. Działa również dla wektorów, w tym wielu liczb całkowitych i zwraca odpowiednie znaki jako jeden ciąg.

vec <- 97:122 
intToUtf8(vec) 
# [1] "abcdefghijklmnopqrstuvwxyz" 

intToUtf8(65) 
# [1] "A" 
Powiązane problemy