2014-04-03 18 views
38
df <- structure(list(`a a` = 1:3, `a b` = 2:4), .Names = c("a a", "a b" 
), row.names = c(NA, -3L), class = "data.frame") 

và các dữ liệu trông giống nhưdplyr: chọn tên cột chứa khoảng trắng

a a a b 
1 1 2 
2 2 3 
3 3 4 

Sau cuộc gọi đến chọn

select(df, 'a a') 

cho

Error in abs(ind[ind < 0]) : 
    non-numeric argument to mathematical function 

Làm thế nào tôi có thể chọn " aa "và/hoặc đổi tên nó thành thứ gì đó không có dấu cách u hát select? Tôi biết các phương pháp sau đây:

  1. names(df)[1] <- "a"
  2. select(df, a=1)
  3. select(df, ends_with("a"))

nhưng nếu tôi đang làm việc trên một tập hợp dữ liệu lớn, làm thế nào tôi có thể nhận được một kết hợp chính xác mà không biết numer index hoặc tên cột tương tự?

Trả lời

42

Bạn có thể select biến bằng cách sử dụng backticks `.

select(df, `a a`) 
# a a 
# 1 1 
# 2 2 
# 3 3 

Tuy nhiên, nếu mục tiêu chính của bạn là để đổi tên cột, bạn có thể sử dụng rename trong plyr gói, trong đó bạn có thể sử dụng cả hai ""``.

rename(df, replace = c("a a" = "a")) 
rename(df, replace = c(`a a` = "a")) 

Hoặc trong base R:

names(df)[names(df) == "a a"] <- "a" 

Để có mô tả kỹ hơn về việc sử dụng dấu ngoặc kép khác nhau, xem ?Quotes. Phần 'Tên và số nhận dạng' đặc biệt có liên quan ở đây:

tên [cú pháp không hợp lệ] khác có thể được sử dụng miễn là chúng được trích dẫn. Các trích dẫn ưa thích là backtick".

Xem thêm ?make.names về tên hợp lệ.

Xem thêm this post về đổi tên trong dplyr

+2

bạn cũng có thể làm tương tự với 'select':' chọn (df, a = \ 'a a \') ' – Arun

+0

@Arun, Cảm ơn đề nghị của bạn. Nhưng không phải cả hai đổi tên "a a", _and_ chỉ chọn biến này (ngược lại với 'đổi tên')? – Henrik

+0

Henrik, bạn nói đúng. Nhưng 'rename' sẽ sao chép toàn bộ data.frame chỉ để đổi tên các cột. Vì vậy, tôi không sử dụng nó/xem xét nó hiệu quả. Tôi không chắc chắn nếu có một cách như 'setattr' trong' data.table'. Ví dụ: 'setattr (df, 'tên', c (" a "," b "))' đổi tên ở đây bằng tham chiếu. – Arun

0

Một số lựa chọn thay thế để backticks, tốt như của dplyr 0.5.0, các Phiên bản hiện tại theo văn bản này

Nếu bạn đang cố gắng chọn lập trình một đối số dưới dạng cột và bạn không muốn đổi tên hoặc làm điều gì đó như paste/sprintf tên cột vào backticks, bạn có thể sử dụng as.name kết hợp với phiên bản non-standard evaluation của select, đó là select_:

dplyr::select_(df, as.name("a a")) 

Nhiều dplyr chức năng có các phiên bản phi tiêu chuẩn. Trong trường hợp cụ thể là select, bạn cũng có thể sử dụng phiên bản tiêu chuẩn cùng với trình trợ giúp chọn one_of.Xem ?dplyr::select_helpers cho tài liệu:

dplyr::select(df, dplyr::one_of("a a")) 
+0

Điều này không đúng. Ngay cả phiên bản NSE của dplyr cũng không xử lý nó. Ví dụ: 'colnames (mtcars) [1] <-" Miles Per Gallon "' 'mtcars%>% select _ (" Miles Per Gallon ")' Điều này sẽ trả về lỗi. – krthkskmr

+1

'mtcars%>% select_ (as.name (" Miles Per Gallon "))' hoạt động. – Andy

Các vấn đề liên quan