praca z n-kolumnową ramką

19 views
Skip to first unread message

Dariusz Chojecki

unread,
Nov 25, 2014, 2:23:48 PM11/25/14
to polska-grupa-...@googlegroups.com
Dzień dobry,
własna funkcja ma działać na ramce n-kolumnowej;
- dekompozycja ramki na n-wektorów
- wykonanie dla każdego wektora określonego przekodowania, np. instrukcją ifelse()
- kompozycja nowej ramki na podstawie n-przekodowanych wektorów.
Napisanie "sztywnej" funkcji, to znaczy dla z góry określonej liczby kolumn w ramce, nie sprawia mi kłopotu. Dalej - już tak. Próbowałem ze stack(), ale skończyłem na stick() ;-). 
Proszę o pomoc
Historyk

Marcin Dyderski

unread,
Nov 25, 2014, 2:58:23 PM11/25/14
to polska-grupa-...@googlegroups.com
Dobry wieczór,
Podobny problem rozwiązywałem mało finezyjnym rozwiązaniem, czyli pętlą for:
ramka<-ramka_na_której_chcemy_pracować
for (i in 1:n) ramka[,i]<-to_co_ma_być_w_ramce
W ten sposób definiujemy kolejne kolumny, które w tym momencie zostają dodane do ramki
Pozdrawiam
Marcin Dyderski


--
Otrzymujesz tę wiadomość, bo subskrybujesz grupę „Polska Grupa Uzytkownikow R” w Grupach dyskusyjnych Google.
Aby anulować subskrypcję tej grupy i przestać otrzymywać od niej wiadomości, wyślij e-maila na polska-grupa-uzytko...@googlegroups.com.
Więcej opcji znajdziesz na https://groups.google.com/d/optout.

Jacek Szejda

unread,
Nov 26, 2014, 2:47:25 AM11/26/14
to polska-grupa-...@googlegroups.com
Dzień dobry,

najprościej rozwiązuje się ten problem tak:

as.data.frame(lapply(ramka, funkcja))

gdzie funkcja przyjmuje pojedynczy wektor. Np. przekodowanie braków danych na zera można by napisać tak:

as.data.frame(lapply(ramka, function(x) { x[is.na(x)] = 0; return(x) }))

Pozdr.,
Jacek

robert bigos

unread,
Nov 26, 2014, 3:50:37 AM11/26/14
to polska-grupa-...@googlegroups.com
Darek,

lapply - Jacek wyjaśnił perfekcyjnie… 

Dużo zależy jakie przekodowania chciałbyś uzyskać … 
Jeżeli musisz uzyskać jakieś przekodowana z grupowaniem lub wykluczeniem … proponuję bibliotekę data.table  i wspomniane przez Jacka lapply.
Biblioteka data.table przy dużych zbiorach i specyficznych zagadnieniach może być wygodniejsza i wydajniejsza ale i tak dobrze wystartować od : lapply.
Strona domowa na GitHub https://github.com/Rdatatable/data.table 
Jeśli szukasz szczegółowej pomocy wstąp na : http://stackoverflow.com/questions/tagged/data.table 

library(data.table)
DT <- data.table(ramka)
DT[,lapply(.SD,sum),by="x,y",.SDcols=301:350]


:) - to dla Jacka :)

Serdecznie Pozdrawiam

Robert

Maciej Beręsewicz

unread,
Nov 26, 2014, 3:54:21 AM11/26/14
to Polska Grupa Uzytkownikow R
albo pakiet dplyr :)

library(dplyr)

ramka %>%
   group_by(x,y) %>%
   summarise_each(sum, kolumna_start:kolumna_koniec)

pytanie w jakiej formie ma to być zwrócone (można później użyć pakietu tidyr - następcy pakietu reshape2 (funkcja gather i spread))


pozdrawiam,
MB

===========================

Maciej Beręsewicz
tel: 663 06 26 87
mail: maciej.b...@gmail.com

Dariusz Chojecki

unread,
Nov 26, 2014, 5:31:03 AM11/26/14
to polska-grupa-...@googlegroups.com
Wszystkim dziękuję za odpowiedzi. To może jeszcze raz o tej mojej wprawce do programowania, ale tym razem z opisem działania funkcji, której argumentem jest ramka o ustalonej liczbie kolumn (posiada nagłówki, w pierwszej kolumnie obiekty, np. geograficzne, w pozostałych dane numeryczne). Zadaniem funkcji jest zwrócenie dwukolumnowej ramki (w pierwszej kolumnie obiekty, w drugiej połączone kody będące złożeniem wyników uzyskanych dla poszczególnych kolumn - wektorów, innymi słowy: np. zwykła tabela znaków z literami i znakami "+" albo "-"). Ramkę rozbijam na wektory, a następnie wykonuje zadane kodowanie instrukcją ifelse() dla każdego z osobna wektora (punktem odniesień, załóżmy, są ich wartości środkowe). Po wykonaniu kodowania łączę uzyskane kody dla poszczególnych wektorów w jeden wektor wynikowy, używając pętli for i funkcji paste(). Ostatnim etapem jest wyświetlenie nowej ramki funkcją data.frame(), w której pierwszym argumentem jest wektor obiektów, drugim natomiast wektor kodów wynikowych. I to już wszystko, jeśli chodzi o ten przyciężkawy algorytm obliczeń (kiedyś zapewnie schudnie wraz z rozwojem mojej wiedzy ;-)
Mój problem polega zatem na automatyzacji uzyskiwania wyników, gdy argumentem własnej funkcji jest ramka o nieustalonej liczbie kolumn. Nie bardzo wiem jak posłużyć się w tym wypadku poleceniem for czy funkcją lapply(). Według mojego "kubusiowego" rozumowania, najpierw - pozostańmy przy for - odpowiednio przygotowane polecenie powinno wydzielić n-wektorów i przekodować je według ustalonych zasad funkcją ifelse(), w drugim kroku, złożyć te kodowania dla n-wektorów w jeden wektor wynikowy, który jest wyświetlany w opisanej ramce wynikowej. Jak już zostaną wydzielone n-wektory (dajmy na to, niech ich liczba maksymalna może wynieść tyle, ile jest liter w alfabecie łacińskim, bo większych ramek nie zakładam), to jak je "połapać", by skleić je w jeden wektor typu character. Zapewne problem trywialny, ale nie dla początkującego "programisty"...
Pozdrawiam
Reply all
Reply to author
Forward
0 new messages