2016-10-17 16 views
5

Tôi có một dataframe, mà tôi muốn thêm một cột để, nơi cột được xác định bởi một tên biến:Thêm một cột mới vào dataframe sử dụng mutate_ nơi tên cột được xác định bởi một biến

df <- diamonds 
NewName <- "SomeName" 
df <- df %>% mutate_(paste0(NewName," = \"\"")) 

Điều này cho tôi lỗi sau:

Error: attempt to use zero-length variable name 

Tôi đã nhìn thấy rất nhiều ví dụ về mutate_ được sử dụng để thay đổi tên cột, chứ không phải để tạo cột động. Bất kỳ giúp đỡ?

+0

I không có lỗi, chỉ cần một cột có tên 'SomeName =" "' – Haboryme

+0

chọn tất cả các dòng và chạy nó một lần nữa, điều này có vẻ là tempramental – pluke

+0

Thật vậy, nó không hoạt động lần thứ hai. – Haboryme

Trả lời

3

Vấn đề phải thực hiện khi đánh giá tuyên bố đang diễn ra. Theo hiểu biết của tôi, mục tiêu của mutate_ không phải là tạo lại cú pháp của mutate, ví dụ: sử dụng paste để tạo mutate(SomeName = ""). Thay vào đó, nó cho phép tạo ra các hàm để truyền. Lý do cách tiếp cận của bạn thất bại là (tôi tin) thực tế là nó đang tìm kiếm một hàm có tên "". Thay vào đó, bạn cần chuyển một hàm có thể được đánh giá (ở đây, tôi đang sử dụng paste làm trình giữ chỗ) và đặt tên của cột đó bằng biến của bạn. Điều này sẽ làm việc:

df <- diamonds 
NewName <- "SomeName" 
df <- df %>% mutate_(.dots = setNames("paste('')",NewName)) 

này cũng cho phép kiểm soát nhiều hơn, ví dụ, bạn có thể dán cutcolor:

df <- df %>% mutate_(.dots = setNames("paste(cut, color)",NewName)) 

cho:

carat  cut color clarity depth table price  x  y  z SomeName 
    <dbl>  <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>  <chr> 
1 0.23  Ideal  E  SI2 61.5 55 326 3.95 3.98 2.43  Ideal E 
2 0.21 Premium  E  SI1 59.8 61 326 3.89 3.84 2.31 Premium E 
3 0.23  Good  E  VS1 56.9 65 327 4.05 4.07 2.31  Good E 
4 0.29 Premium  I  VS2 62.4 58 334 4.20 4.23 2.63 Premium I 
5 0.31  Good  J  SI2 63.3 58 335 4.34 4.35 2.75  Good J 
6 0.24 Very Good  J VVS2 62.8 57 336 3.94 3.96 2.48 Very Good J 
7 0.24 Very Good  I VVS1 62.3 57 336 3.95 3.98 2.47 Very Good I 
8 0.26 Very Good  H  SI1 61.9 55 337 4.07 4.11 2.53 Very Good H 
9 0.22  Fair  E  VS2 65.1 61 337 3.87 3.78 2.49  Fair E 
10 0.23 Very Good  H  VS1 59.4 61 338 4.00 4.05 2.39 Very Good H 

(Đáng chú ý, tôi cũng nhận được cú pháp ban đầu để làm việc lần đầu tiên, tiếp theo là các lỗi tiếp theo. Giá trị đào sâu vào.)

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