2015-05-06 19 views
10

Có cách nào để sử dụng chuỗi được lưu trữ trong biến dưới dạng tên cột trong khung dữ liệu mới không? Kết quả dự kiến ​​nên là:Biến làm tên cột trong khung dữ liệu

col.name <- 'col1' 
df <- data.frame(col.name=1:4) 
print(df) 

# Real output 
    col.name 
1  1 
2  2 
3  3 
4  4 

# Expected output 
    col1 
1 1 
2 2 
3 3 
4 4 

Tôi biết rằng tôi có thể tạo khung dữ liệu và sau đó sử dụng tên() để đổi tên cột hoặc sử dụng df [, col.name] cho đối tượng hiện có, nhưng Tôi muốn biết nếu có bất kỳ giải pháp nào khác có thể được sử dụng trong quá trình tạo khung dữ liệu.

+1

'data.frame (col1 = 1: 4) 'sẽ cung cấp cho bạn "đầu ra mong đợi" – Jeff

+3

@ Jeff nhưng anh muốn vượt qua' "col1" 'từ một biến – shadowtalker

+0

Bằng cách này, tôi đã đã gắn cờ câu hỏi này để chuyển sang Stack Overflow, vì đó là về lập trình trong R chứ không phải về thống kê. – shadowtalker

Trả lời

14

Bạn không thể chuyển một biến vào tên đối số như vậy.

Thay vì những gì bạn có thể làm là:

df <- data.frame(placeholder_name = 1:4) 
names(df)[names(df) == "placeholder_name"] <- col.name 

hoặc sử dụng tên mặc định của "V1":

df <- data.frame(1:4) 
names(df)[names(df) == "V1"] <- col.name 

hoặc gán bởi vị trí:

df <- data.frame(1:4) 
names(df)[1] <- col.name 

hoặc nếu bạn chỉ có một cột chỉ thay thế toàn bộ thuộc tính names:

df <- data.frame(1:4) 
names(df) <- col.name 

Ngoài ra còn có các set_names chức năng trong magrittr gói mà bạn có thể sử dụng để làm giải pháp cuối cùng này chỉ trong một bước:

library(magrittr) 
df <- set_names(data.frame(1:4), col.name) 

Nhưng set_names chỉ là một bí danh cho:

df <- `names<-`(data.frame(1:4), col.name) 

là một phần của cơ sở R. Tìm hiểu lý do tại sao biểu thức này hoạt động và có ý nghĩa sẽ là một bài tập tốt.

+3

Ngoài ra, có 'setNames' từ' base R' – akrun

0

Tôi không khuyên bạn làm điều này, nhưng:

col.name <- 'col1' 
eval(parse(text=paste0('data.frame(', col.name, '=1:4)'))) 
+2

Đây thực sự là một cách rất tồi tệ để làm điều đó. Phân tích các giá trị văn bản tùy ý là nguy hiểm và cần tránh. – MrFlick

+0

@MrFlick Thật vậy. – Zach

3

Ngoài câu trả lời ssdecontrol, có là một lựa chọn thứ hai.

Bạn đang tìm kiếm mget. Đầu tiên gán tên cho biến, sau đó là giá trị cho biến mà bạn đã gán trước đó. Sau đó, mget sẽ đánh giá chuỗi và chuyển nó tới data.frame.

assign(col.name, "col1") 
assign(paste(col.name), 1:4) 

df <- data.frame(mget(col.name)) 
print(df) 
    col1 
1 1 
2 2 
3 3 
4 4 
Các vấn đề liên quan