2015-06-11 7 views
9

Pamiętam komentarz na temat r-help z 2001 roku, który stwierdził, że drop = TRUE w [.data.frame była najgorszą decyzją projektową w historii R.Najlepsza praktyka, aby uzyskać upuszczoną kolumnę w dplyr tbl_df

dplyr to koryguje i nie zrzuca automatycznie. Podczas próby przekonwertowania starego kodu na styl dplyr wprowadza to pewne nieprzyjemne błędy, gdy przyjmuje się, że d[, 1] lub d[1] jest wektorem.

Moje bieżące obejście używa unlist, jak pokazano poniżej, aby uzyskać wektor z jedną kolumną. Jakieś lepsze pomysły?

library(dplyr) 

d2 = data.frame(x = 1:5, y = (1:5)^2) 
str(d2[,1]) # implicit drop = TRUE 
# int [1:5] 1 2 3 4 5 

str(d2[,1, drop = FALSE]) 
# data.frame': 5 obs. of 1 variable: 
# $ x: int 1 2 3 4 5 

# With dplyr functions 
d1 = data_frame(x = 1:5, y = x^2) 
str(d1[,1]) 
# Classes ‘tbl_df’ and 'data.frame': 5 obs. of 1 variable: 
# $ x: int 1 2 3 4 5 

str(unlist(d1[,1])) 
# This ugly construct gives the same as str(d2[,1]) 
str(d1[,1][[1]]) 
+2

Dlaczego nie wystarczy użyć 'd1 [[1]]' – shadow

+0

Działa również. Zgubiłem się w przestrzeni [[]]. Opublikuj jako odpowiedź jako odniesienie. Opublikowalem to podsumowanie, poniewaz nie moglem go znalezc na SO i w dokumentach. Jeśli ktoś znalazł zastrzeżenie w dokumentach "dplyr", dodaj link tutaj. –

Odpowiedz

7

można po prostu użyć funkcji [[ ekstrakt zamiast [.

d1[[1]] 
## [1] 1 2 3 4 5 

Jeśli używasz dużo rurociągów z dplyr, można również użyć funkcji wygodę extract i extract2 z pakietu magrittr:

d1 %>% magrittr::extract(1) %>% str 
## Classes ‘tbl_df’ and 'data.frame': 5 obs. of 1 variable: 
## $ x: int 1 2 3 4 5 
d1 %>% magrittr::extract2(1) %>% str 
## int [1:5] 1 2 3 4 5 

Lub jeśli extract jest zbyt rozwlekły dla ciebie, można po prostu użyć [ bezpośrednio w rurze:

d1 %>% `[`(1) %>% str 
## Classes ‘tbl_df’ and 'data.frame': 5 obs. of 1 variable: 
## $ x: int 1 2 3 4 5 
d1 %>% `[[`(1) %>% str 
## int [1:5] 1 2 3 4 5 
+0

'magrittr :: extract (1)' zostało wspomniane w innym wątku SO. Jest trochę gadatliwy i niezbyt wygodny, gdy potrzebujesz kilku kolumn. –

+0

'[[' (1): dobra demonstracja, ale jeden z powodów, dla których wiele osób uważa, że ​​R jest drugim względem Perla jako językiem tylko do zapisu. –

+0

Skąd pochodzą '\' [\ (1) 'i' \ '[[\' (1) ', czyli gdzie mogę znaleźć trochę dokumentacji? I dlaczego miałbym wstawić nazwany wektor w cudzysłowie, gdy chcę użyć ekstraktu 2, tj. 'Extract2 (" x ") – dpprdan

Powiązane problemy