Làm cách nào để thay đổi tên cột trong khung dữ liệu trong R? [đóng cửa]


9
 names(mydat)[c(name)]<-c("newname") 

Từ đó, tôi biết rằng tên / tên biến "tên" của khung dữ liệu mydat được thay thế bằng "newname".

Câu hỏi của tôi là nếu, tôi muốn làm điều này bằng một vòng lặp để tôi sẽ có một số thứ như:

newname1 newname2 newname3 newname4, v.v., làm thế nào để tôi làm điều đó?

Đây là những gì đã làm và nó không hoạt động:

for(i in 1:4){
names(mydat)[c(name)]<-c("newname"i)
}

Có cách nào để mã này không? cảm ơn tất cả những người có thể giúp đỡ Owusu Isaac


4
Câu hỏi này dường như lạc đề vì nó hoàn toàn là về lập trình.
gung - Phục hồi Monica

Nếu bạn cần đổi tên một số tên biến xấu xí (ví dụ: abcde_1_1, abcde_2_2, abcde_3_3 ...) vì nó thường xảy ra trong một số bộ dữ liệu được tải xuống từ Qualtrics: ugly_vars <- names(dplyr::select(df, starts_with("abcde_"))) names(ESM_df[ugly_vars]) <- str_c("abc_", 1:length(ugly_vars))
JetLag

Câu trả lời:


10

Giải pháp rõ ràng nhất sẽ là thay đổi mã của bạn trong vòng lặp for bằng cách sau:

   names(mydat)[c(name)] <- paste("newname",i,sep="")

Nhưng bạn cần làm rõ biến của bạn namelà gì. Tại thời điểm này, vòng lặp này sẽ thực hiện 4 lần đổi tên của cột đơn.

Nói chung nếu tên mà bạn muốn thay đổi nằm trong vectơ, thì đây là quy trình đặt lại tiêu chuẩn:

 names(mydat)[names(mydat)%in% names_to_be_changed] <- name_changes

Xin chào Mpiktas, giải pháp của bạn hoạt động xuất sắc. cảm ơn nhiều. và cảm ơn tất cả là tốt
Con trai

1
@Owusu, sự thể hiện lòng biết ơn trong trang web này đang nâng cao các câu trả lời và sự chấp nhận của họ. Xem faq . Dù bằng cách nào, vui mừng khi được giúp đỡ.
mpiktas

6

Hãy thử sử dụng sprintfhoặc paste, như thế này:

names(mydat)<-sprintf("name%d",1:10)

Ngoài ra, lưu ý rằng names(mydat)[c(name)]nhiều hơn một chút vô nghĩa; c(name)tương đương với việc viết chỉ namevà có nghĩa là "lấy giá trị của biến được gọi là name'; ngoặc sẽ ít nhất trích xuất các phần tử của names(mydat)nhưng chỉ khi namebiến giữ một chỉ số số hoặc boolean.

Nếu bạn muốn thay thế các cột được gọi namebằng name1, name2, ..., nameN, hãy sử dụng một cái gì đó như thế này:

names(mydat)[names(mydat)=="name"]<-sprintf("name%d",1:sum(names(mydat)=="name"))

EDIT: Vâng, nếu bạn chỉ muốn xóa tên cột trùng lặp, thậm chí còn có cách dễ dàng hơn; R có make.nameschức năng khắc phục vấn đề này; nó có thể được sử dụng như thế này:

names(mydat)<-make.names(names(mydat),unique=TRUE)

Thậm chí ngắn hơn, điều tương tự chỉ có thể đạt được bằng cách viết:

data.frame(mydat)->mydat #The magic is in check.names, but it is TRUE by default

@mbq, == có khớp một phần cho chuỗi không?
mpiktas

@mpiktas Không, nhưng chỉ cần kết hợp chính xác ở đây. greplsẽ ổn để làm công việc chung hơn.

@mbq, có nhưng giả sử rằng có nhiều cột có cùng tên. R cho phép điều đó, nhưng tôi cố gắng tránh sử dụng tính năng này.
mpiktas

@mpiktas Rõ ràng OP cũng vậy, vì vậy câu hỏi này.

@mbq cảm ơn vì đã làm rõ sự nhầm lẫn với tên (mydat) [c (name)] Vì OP đã viết nên tôi biết rằng cột / tên biến "tên" Tôi giống như "wow điều đó là có thể?" và cố gắng truy cập tên theo tên ... ngu ngốc tôi;). Tôi có thể khiêm tốn đề nghị chỉnh sửa câu hỏi không?
steffen

5

Tôi đã có cùng một vấn đề và tôi đã giải quyết nó với mã này:

names(mydat) <- paste("newname", 1:ncol(mydat), sep="");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.