2014-06-12 25 views
12

Tôi cần phải đặt một df để bao gồm một số chuỗi nhất định. Một số trong số này là tên cột đầy đủ, và sau hoạt động tốt:Dữ liệu tập hợp con dựa trên kết hợp từng phần của tên cột

testData[,c("FullColName1","FullColName2","FullColName3")] 

Vấn đề của tôi là tôi cần phải mở rộng này cũng bao gồm tên cột có chứa chuỗi cụ thể mà có thể phần nào phù hợp với một số tên cột khác. Các chuỗi này bao gồm các chữ cái và ký hiệu:

"PartString1()","PartString2()" 

Tôi đã thử đặt các ký tự đại diện xung quanh các ký tự này. (Tôi đã chỉ ra điều này dưới đây với tiền tố "sao" vì biểu tượng "*" không hiển thị chính xác.)

testData[ ,c("FullColName1","FullColName2","FullColName3", 
      "starPartString1()star","starPartString2()star")] 

Nhưng tôi nhận được thông báo lỗi: các cột không xác định được chọn. Tôi không thể tìm ra nếu hoặc làm thế nào tôi cần grep để thực hiện công việc này.

+1

"PartString1()" là gì? Các cặp dấu ngoặc đơn làm cho tôi nghĩ rằng bạn đang sử dụng một hàm. Nó KHÔNG phải là tên R hợp lệ. Hãy thử đặt mã để xây dựng những gì bạn đang làm việc. –

+0

"PartString1()" là tên biến. Tôi đã cố gắng sử dụng grep để phù hợp trên tên cột một phần bao gồm các chuỗi char cụ thể và một tập hợp các dấu ngoặc đơn. Vấn đề được giải quyết với df2 <-df1 [, grepl ("FullColName1 | FullColName2 | FullColName3 | PartSting1 [[: dấu chấm:]] | PartString2 [[: dấu chấm:]]", tên (df1))] – user3614783

Trả lời

10

Bạn đã đề cập đến bạn có thể đang tìm kiếm các ký hiệu, vì vậy với ví dụ cụ thể này, chúng tôi có thể sử dụng [[:punct:]] làm cụm từ thông dụng của chúng tôi. Điều này sẽ tìm thấy tất cả các chuỗi với các ký hiệu dấu chấm câu trong các tên cột.

d <- data.frame(1:3, 3:1, 11:13, 13:11, rep(1, 3)) 
names(d) <- c("FullColName1", "FullColName2", "FullColName3", 
       "PartString1()","PartString2()") 

d[grepl("[[:punct:]]", names(d))] 
# PartString1() PartString2() 
# 1   13    1 
# 2   12    1 
# 3   11    1 

phần cuối cùng này chỉ minh họa một cách khác để làm điều này với chức năng xử lý chuỗi khác từ stringr

library(stringr) 
d[str_detect(names(d), "[[:punct:]]")] 
# PartString1() PartString2() 
# 1   13    1 
# 2   12    1 
# 3   11    1 

ADD mỗi Ops bình luận

d[grepl("ring[12()]", names(d))] 

để có được một trong các chuỗi con ring1() hoặc ring2() từ tên vector

+0

Cảm ơn rất nhiều Richard. Tôi không biết về [[: punct:]]. Điều này gần như giải quyết vấn đề của tôi, nhưng tôi cần phải chọn tất cả các cột có chuỗi con ring1() hoặc chuỗi con ring2(). Chỉ tìm kiếm dấu chấm câu quá rộng. – user3614783

+0

Đó chỉ là 'd [, grepl (" ring [12()] ", tên (d))]'. Bạn có muốn tôi thay đổi điều đó trong câu trả lời của tôi không? –

+0

Tôi đến với d [, grep ("ring1 [[: punct:]] | ring2 [[: punct:]]", tên (d))], nhưng bạn thanh lịch hơn. Cảm ơn một lần nữa. – user3614783

3

Bạn có thể sử dụng grepl để tìm kiếm theo tên cột. Nó trả về một vector hợp lý cho biết các kết quả phù hợp.

Dưới đây là một ví dụ:

d <- read.table(header=TRUE, check.names=FALSE, 
       text="1PartString()2 1PartString()3 OtherCol 
       1 2 3 
       3 4 5") 
d 
## 1PartString()2 1PartString()3 OtherCol 
## 1    1    2  3 
## 2    3    4  5 

d[,grepl("PartString\\(\\)", names(d))] 
## 1PartString()2 1PartString()3 
## 1    1    2 
## 2    3    4 

grepl kiểm tra xem mô hình có mặt bất cứ nơi nào trong tên, do đó, một ký tự đại diện là không cần thiết.

+0

Hoặc chỉ sử dụng patt = " PartString ".Khái niệm đặt cặp ngoặc trong cặp dataframe có vẻ như sai. –

8

Bạn có thể sử dụng grep để tìm chỉ số của tên cột với trận đấu một phần để một mô hình đặc biệt

require(PerformanceAnalytics) 
data(managers) 

colnames(managers) 
#[1] "HAM1"  "HAM2"  "HAM3"  "HAM4"  "HAM5"  
#[6] "HAM6"  "EDHEC LS EQ" "SP500 TR" "US 10Y TR" "US 3m TR" 

giả mô hình bạn muốn kết hợp là "HAM", cùng với một số tên cột cố định (" SP500 TR" "Mỹ 10Y TR" "Mỹ 3m TR")

head(managers[,c("SP500 TR","US 10Y TR","US 3m TR",colnames(managers)[grep("HAM",colnames(managers))])]) 
#   SP500 TR US 10Y TR US 3m TR HAM1 HAM2 HAM3 HAM4 HAM5 HAM6 
#1996-01-31 0.0340 0.00380 0.00456 0.0074 NA 0.0349 0.0222 NA NA 
#1996-02-29 0.0093 -0.03532 0.00398 0.0193 NA 0.0351 0.0195 NA NA 
#1996-03-31 0.0096 -0.01057 0.00371 0.0155 NA 0.0258 -0.0098 NA NA 
#1996-04-30 0.0147 -0.01739 0.00428 -0.0091 NA 0.0449 0.0236 NA NA 
#1996-05-31 0.0258 -0.00543 0.00443 0.0076 NA 0.0353 0.0028 NA NA 
#1996-06-30 0.0038 0.01507 0.00412 -0.0039 NA -0.0303 -0.0019 NA NA 

bạn có thể chỉ định nhiều mô hình sử dụng, grep("pattern1 | pattern2 ", colnames(data))

+0

cảm ơn đã cho tôi xem ví dụ về nhiều mẫu của bạn. Tôi đã đặt từng mẫu trong dấu ngoặc kép, thay vì đặt dấu ngoặc kép xung quanh toàn bộ các mẫu. – user3614783

+0

Trong ứng dụng của tôi, tôi đã phải viết '' grep ("pattern1 | pattern2", colnames (dữ liệu)) '', * không có * một khoảng trống của '' | '' – PatrickT

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