2012-11-06 42 views
5

Tôi có một số lượng lớn các tập dữ liệu, mỗi tập hợp chứa một danh sách dài các tên cột. Trong một số tệp, tên cột là tất cả các chữ cái viết hoa và trong một số tệp chỉ có chữ cái đầu tiên của tên cột được viết hoa. Tôi cần phải nối thêm các tập dữ liệu và nghĩ cách dễ nhất để khớp tên cột giữa các tập dữ liệu sẽ là chuyển đổi tất cả tên vốn thành các tên chỉ có chữ cái đầu tiên được viết hoa.Thay đổi trường hợp chữ cái của các tên cột

Tôi hy vọng tìm được giải pháp chung, thậm chí có thể là một lớp lót.

Đây là tập dữ liệu mẫu của tôi. Tên mong muốn được bao gồm trong các tuyên bố names.

my.data2 <- " 
landuse units grade CLAY LINCOLN BASINANDRANGE MCCARTNEY MAPLE 
apple acres AAA  0   2   3    4   6 
apple acres AA 1000  900   NA   NA  700 
pear acres AA 10.0  20   NA   30.0  40 
peach acres AAA 500  400  350   300  200 
" 
my.data2 <- read.table(textConnection(my.data2), header=TRUE) 

names(my.data2)[names(my.data2)=="CLAY"]   <- "Clay" 
names(my.data2)[names(my.data2)=="BASINANDRANGE"] <- "BasinandRange" 
names(my.data2)[names(my.data2)=="LINCOLN"]   <- "Lincoln" 
names(my.data2)[names(my.data2)=="MCCARTNEY"]  <- "McCartney" 
names(my.data2)[names(my.data2)=="MAPLE"]   <- "Maple" 

my.data2 

Lưu ý rằng tôi đã bao gồm tên McCartneyBasinandRange để làm cho mọi thứ thực tế hơn và khó khăn hơn. Tuy nhiên, nếu tôi có thể tìm thấy một lớp lót để xử lý 95% tên và sử dụng các câu lệnh trên names để xử lý các biến chứng như McCartneyBasinandRange, điều đó thật tuyệt vời.

Tôi đã tìm kiếm trên Internet, bao gồm lưu trữ StackOverflow mà không cần tìm giải pháp. Xin lỗi nếu tôi bỏ qua một. Cảm ơn bạn đã giúp đỡ.

+3

Nó có lẽ sẽ dễ dàng hơn nếu bạn chuyển đổi tất cả các tên cho tất cả-chữ hoa hoặc toàn-chữ thường sử dụng 'toupper' hoặc' tolower', tương ứng. Chuyển đổi chúng thành trường hợp hỗn hợp sẽ khó hơn. –

Trả lời

19

Đây là một one-liner triển khai "Cách đơn giản nhất để phù hợp với tên cột trong các tập dữ liệu" mà tôi có thể nghĩ đến:

## Columns 1:3 left unaltered since they are not place names. 
names(my.data2)[-1:-3] <- tolower(names(my.data2)[-1:-3]) 

## View the results 
names(my.data2) 
# [1] "landuse"  "units"   "grade"   "clay"   
# [5] "lincoln"  "basinandrange" "mccartney"  "maple" 
1

tôi đã sử dụng câu trả lời Josh O'Brien, nhưng cuối cùng đã viết đoạn code dưới đây tạo tên cột với chữ cái đầu tiên là trong chữ thường và các chữ cái khác trong chữ thường, với một vài ngoại lệ được xử lý như trong bài gốc. Dưới đây tôi đã sử dụng cùng một dữ liệu thiết lập như trong các bài bản gốc, nhưng đọc dữ liệu đó vào R khác nhau nơi n.col xác định số cột trong file dữ liệu:

n.col <- as.numeric(length(scan("c:/users/mark w miller/simple R programs/names_with_capital_letters.txt", 
     what="character", nlines=1))) 

my.data2 <- read.table(file = "c:/users/mark w miller/simple R programs/names_with_capital_letters.txt", 
      na.string=NA, header = T, colClasses = c('character', 'character', 'character', 
      rep('numeric', (n.col[1] - 3)))) 

first.letter <- substring(names(my.data2)[-1:-3], 1, 1) 
other.letters <- tolower(substring(names(my.data2)[-1:-3], 2)) 
newnames  <- paste(first.letter, other.letters, sep="") 

names(my.data2)[-1:-3] <- newnames 
names(my.data2)[names(my.data2)=="Basinandrange"] <- "BasinandRange" 
names(my.data2)[names(my.data2)=="Mccartney"]  <- "McCartney" 

my.data2 

# landuse units grade Clay Lincoln BasinandRange McCartney Maple 
# 1 apple acres AAA 0  2    3   4  6 
# 2 apple acres AA 1000  900   NA  NA 700 
# 3 pear acres AA 10  20   NA  30 40 
# 4 peach acres AAA 500  400   350  300 200 
3

cú pháp data.table, tôi tin rằng sẽ tiết kiệm thời gian hơn và hiệu quả. nó cũng là một tuyên bố một dòng, thậm chí ngắn hơn.

setnames(my.data2, tolower(names(my.data2[4:8])))

# landuse units grade clay lincoln basinandrange mccartney maple 
#1: apple acres AAA 0  2    3   4  6 
#2: apple acres AA 1000  900   NA  NA 700 
#3: pear acres AA 10  20   NA  30 40 
#4: peach acres AAA 500  400   350  300 200 
Các vấn đề liên quan