Mam duży zestaw danych i chciałbym przeczytać określone kolumny lub usunąć wszystkie pozostałe.
data <- read.dta("file.dta")
Wybieram kolumny, które mnie nie interesują:
var.out <- names(data)[!names(data) %in% c("iden", "name", "x_serv", "m_serv")]
i wtedy chciałbym zrobić coś takiego:
for(i in 1:length(var.out)) {
paste("data$", var.out[i], sep="") <- NULL
}
aby usunąć wszystkie niechciane kolumny. Czy to optymalne rozwiązanie?
subset(data, select=c(...))
pomaga w moim przypadku na odrzucenie vars. pytanie dotyczyło główniepaste("data$",var.out[i],sep="")
części umożliwiającej dostęp do interesujących kolumn wewnątrz pętli. jak mogę wkleić lub jakoś skomponować nazwę kolumny? Dziękujemy wszystkim za uwagę i pomocOdpowiedzi:
Powinieneś użyć indeksowania lub
subset
funkcji. Na przykład :Następnie możesz użyć
which
funkcji i-
operatora do indeksacji kolumn:Lub, znacznie prościej, użyj
select
argumentusubset
funkcji: możesz następnie użyć-
operatora bezpośrednio na wektorze nazw kolumn, a nawet pominąć cudzysłowy wokół nazw!Pamiętaj, że możesz także wybrać kolumny, które chcesz, zamiast upuszczać inne:
źródło
select
argumentsubset
funkcji spełnił swoje zadanie doskonale! Dziękuję juba!which
nie jest konieczne, patrz odpowiedź Isti. Ale podzbiór z-
jest fajny! Nie wiedziałem tego!subset
wygląda dobrze, ale sposób, w jaki cicho upuszcza brakujące wartości, wydaje mi się dość niebezpieczny.subset
jest rzeczywiście bardzo wygodny, ale pamiętaj, aby unikać używania go, chyba że używasz R. interaktywnie. Aby uzyskać więcej informacji, zobacz Ostrzeżenie w dokumentacji funkcji i to pytanie SO .Nie używaj
-which()
do tego, jest to bardzo niebezpieczne. Rozważać:Zamiast tego użyj podzestawu lub
!
funkcji:Nauczyłem się tego z bolesnego doświadczenia. Nie nadużywaj
which()
!źródło
setdiff
jest również przydatny:setdiff(names(dat), c("foo", "bar"))
setdiff
Propozycja @hadley jest bardzo dobra dla długich list nazwisk.Po pierwsze , możesz użyć bezpośredniego indeksowania (z wektorami logicznymi) zamiast ponownego dostępu do nazw kolumn, jeśli pracujesz z tą samą ramką danych; będzie to bezpieczniejsze, jak wskazała Ista, i szybsze pisanie i wykonywanie. Potrzebujesz więc tylko:
a następnie po prostu ponownie przypisz dane:
Po drugie , szybciej pisać, możesz bezpośrednio przypisać NULL do kolumn, które chcesz usunąć:
Na koniec możesz użyć subset (), ale tak naprawdę nie można go użyć w kodzie (nawet plik pomocy ostrzega o tym). W szczególności problem polega na tym, że jeśli chcesz bezpośrednio użyć funkcji upuszczania susbset (), musisz napisać bez cudzysłowu wyrażenie odpowiadające nazwom kolumn:
Jako bonus , oto mały test porównawczy różnych opcji, który wyraźnie pokazuje, że podzbiór jest wolniejszy, a pierwsza metoda zmiany przypisania jest szybsza:
Kod jest poniżej:
źródło
NULL
, ale dlaczego, kiedy podajesz więcej niż dwa nazwiska, konieczne jest przypisanie jejlist(NULL)
? Jestem ciekawy, jak to działa, ponieważ próbowałem tylko z jednym imieniem i nie potrzebujęlist()
$
lub[[
), użycie<- list(NULL)
spowoduje w rzeczywistości nieprawidłowe wyniki. Jeśli uzyskujesz dostęp do podzbioru ramki danych z jedną lub wieloma kolumnami,<- list(NULL)
jest to dobra droga, nawet jeśli nie jest to potrzebne dla ramki danych z jedną kolumną (ponieważdf['myColumns']
w razie potrzeby zostanie rzutowany na wektor).Możesz także wypróbować
dplyr
pakiet:źródło
dplyr::select(df2, -one_of(c('x','y')))
nadal będzie działać (z ostrzeżeniem), nawet jeśli niektóre z nazwanych kolumn nie istniejąOto szybkie rozwiązanie tego problemu. Powiedzmy, że masz ramkę danych X z trzema kolumnami A, B i C:
Jeśli chcę usunąć kolumnę, powiedzmy B, po prostu użyj grep na nazwach kolumn, aby uzyskać indeks kolumny, którego możesz następnie użyć, aby pominąć kolumnę.
Twoja nowa ramka danych X wyglądałaby następująco (tym razem bez kolumny B):
Piękno grep polega na tym, że można określić wiele kolumn pasujących do wyrażenia regularnego. Gdybym miał X z pięcioma kolumnami (A, B, C, D, E):
Wyjmij kolumny B i D:
EDYCJA: Biorąc pod uwagę sugestię grepl Matthew Lundberg w komentarzach poniżej:
Jeśli spróbuję usunąć kolumnę, która nie istnieje, nic się nie powinno stać:
źródło
X[,-grep("B",colnames(X))]
nie zwróci żadnych kolumn w przypadku, gdy nie zawiera nazwy kolumnyB
, zamiast zwracać wszystkie kolumny zgodnie z oczekiwaniami. RozważX <- iris
na przykład. Jest to problem z użyciem ujemnych wskaźników z obliczonymi wartościami. Zastanów sięgrepl
zamiast tego.Próbowałem usunąć kolumnę podczas korzystania z pakietu
data.table
i otrzymałem nieoczekiwany wynik. Myślę, że warto opublikować poniższe. Tylko mała uwaga ostrzegawcza.[Edytowane przez Matthew ...]
Zasadniczo składnia parametru
data.table
NIE jest dokładnie taka sama jakdata.frame
. W rzeczywistości istnieje wiele różnic, patrz FAQ 1.1 i FAQ 2.17. Zostałeś ostrzeżony!źródło
DT[,var.out := NULL]
do usunięcia kolumn, które chcesz to zrobić.data.frame
i dladata.table
klasZmieniłem kod na:
W każdym razie odpowiedź juby jest najlepszym rozwiązaniem mojego problemu!
źródło
select
argumentusubset
funkcji w moim kodzie. Chciałem tylko zobaczyć, jak mogę uzyskać dostęp do dowolnych kolumn w pętli, na wypadek, gdyby chciałem zrobić coś innego niż tylko upuszczenie kolumny. oryginalny zestaw danych zawiera około 1200 zmiennych i jestem zainteresowany tylko użyciem 4 z nich, nie wiedząc, gdzie dokładnie są.Oto inne rozwiązanie, które może być pomocne dla innych. Poniższy kod wybiera niewielką liczbę wierszy i kolumn z dużego zestawu danych. Kolumny są wybierane jak w jednej z odpowiedzi Juba, z wyjątkiem tego, że używam funkcji wklejania, aby wybrać zestaw kolumn o nazwach numerowanych kolejno:
źródło
źródło
Nie mogę odpowiedzieć na twoje pytanie w komentarzach z powodu niskiej oceny reputacji.
Następny kod da ci błąd, ponieważ funkcja wklejania zwraca ciąg znaków
Oto możliwe rozwiązanie:
lub po prostu zrób:
źródło
dfnum = df[,-c(8,9)]
źródło