2015-04-29 14 views
6

Tôi muốn thêm một hậu tố hoặc tiền tố với hầu hết các tên biến trong một data.frame, điển hình là sau khi tất cả họ đã được biến đổi một cách nào đó và trước khi thực hiện tham gia. Tôi không có một cách để làm điều này mà không phá vỡ đường ống của tôi.Thêm tiền tố hoặc hậu tố đối với hầu hết data.frame tên biến trong công việc R đường ống

Ví dụ, với các dữ liệu này:

library(dplyr) 
set.seed(1) 
dat14 <- data.frame(ID = 1:10, speed = runif(10), power = rpois(10, 1), 
        force = rexp(10), class = rep(c("a", "b"),5)) 

Tôi muốn để có được kết quả này (lưu ý tên biến):

class speed_mean_2014 power_mean_2014 force_mean_2014 
1  a  0.5572500    0.8  0.5519802 
2  b  0.2850798    0.6  1.0888116 

cách tiếp cận hiện tại của tôi là:

means14 <- dat14 %>% 
    group_by(class) %>% 
    select(-ID) %>% 
    summarise_each(funs(mean(.))) 

names(means14)[2:length(names(means14))] <- paste0(names(means14)[2:length(names(means14))], "_mean_2014") 

có một thay thế cho rằng dòng cuối cùng vụng về mà phá vỡ lên ống của tôi? Tôi đã xem select()rename() nhưng không muốn chỉ định rõ ràng từng tên biến, vì tôi thường muốn đổi tên tất cả ngoại trừ một biến duy nhất và có thể có khung dữ liệu rộng hơn nhiều so với ví dụ này.

Tôi đang tưởng tượng một lệnh đường ống cuối cùng mà xấp xỉ chức năng làm-up này:

appendname(cols = 2:n, str = "_mean_2014", placement = "suffix") 

nào không tồn tại như xa như tôi biết.

Trả lời

4

Sau khi thêm thử nghiệm kể từ khi đăng câu hỏi này, tôi đã phát hiện ra rằng setNames chức năng sẽ làm việc với các đường ống vì nó trả về một data.frame:

dat14 %>% 
    group_by(class) %>% 
    select(-ID) %>% 
    summarise_each(funs(mean(.))) %>% 
    setNames(c(names(.)[1], paste0(names(.)[-1],"_mean_2014"))) 

    class speed_mean_2014 power_mean_2014 force_mean_2014 
1  a  0.5572500    0.8  0.5519802 
2  b  0.2850798    0.6  1.0888116 
3

Đây là một chút nhanh hơn, nhưng không hoàn toàn những gì bạn muốn:

dat14 %>% 
    group_by(class) %>% 
    select(-ID) %>% 
    summarise_each(funs(mean(.))) -> means14 

names(means14)[-1] %<>% paste0("_mean_2014") 

nếu bạn đã không sử dụng% <>% - điều hành trước khi chắc chắn kiểm tra link này ra, một công cụ siêu hữu ích của nó .

bạn cũng có thể sử dụng nó cho recomputing hoặc làm tròn một số cột, như df$meancolumn %<>% round() này, và như vậy, nó chỉ đi lên rất thường xuyên và chỉ giúp bạn tiết kiệm rất nhiều văn bản

+0

sử dụng tốt '% <>%' và cảm ơn bạn đã đăng liên kết, luôn đọc tốt như một người bồi dưỡng – infominer

+1

cảm ơn, tôi hoàn toàn yêu thích toán tử '% <>%', nó rất hữu ích, vì các tác vụ đó thường xuất hiện, bạn cũng có thể sử dụng nó để tính toán lại hoặc làm tròn một số cột, như 'df $ meancolumn% <>% round() ', v.v., nó xuất hiện rất thường xuyên và chỉ giúp bạn tiết kiệm rất nhiều văn bản – grrgrrbla

+0

Chắc chắn là một cải tiến, cảm ơn. Tôi sử dụng '% <>%' thường xuyên để thay thế 'df <- df %>% ...' nhưng nó không bao giờ xảy ra với tôi để sử dụng nó cho các kiểu dữ liệu khác như vectơ. Ví dụ của bạn với 'round()' khá súc tích! –

0

Đây là nhiều hơn một bước trở lại, nhưng bạn có thể nghĩ về định hình lại dữ liệu của bạn nhằm áp dụng các chức năng đến nhiều năm cùng một lúc. Điều này sẽ giữ gìn tidyness. Nếu bạn đang đi để muốn kết thúc so sánh năm khác nhau, nó có thể làm cho tinh thần để có năm là một biến riêng biệt trong một dataframe, chứ không phải lưu trữ năm trong tên. Bạn sẽ có thể sử dụng summarise_ để có được những hành vi mean_year. Xem http://cran.r-project.org/web/packages/dplyr/vignettes/nse.html

library(dplyr) 
library(tidyr) 
set.seed(1) 
dat14 <- data.frame(ID = 1:10, speed = runif(10), power = rpois(10, 1), 
        force = rexp(10), class = rep(c("a", "b"),5)) 

dat14 %>% 
    gather(variable, value, -ID, -class) %>% 
    mutate(year = 2014) %>% 
    group_by(class, year, variable)%>% 
    summarise(mean = mean(value))` 
0

Trong khi Sam Firkes giải pháp sử dụng setNames() ist chắc chắn là giải pháp duy nhất giữ một ống không gián đoạn, nó sẽ không làm việc với các tbl đối tượng từ dplyr, kể từ khi tên cột không thể truy cập bằng các phương pháp từ các cơ sở R thông thường chức năng đặt tên. Dưới đây là một chức năng mà bạn có thể sử dụng trong một đường ống với các đối tượng tbl, nhờ vào giải pháp this bởi hrbrmstr. Nó thêm tiền tố được xác định trước và hậu tố tại các chỉ mục cột được chỉ định. Mặc định là tất cả các cột.

tbl.renamer <- function(tbl,prefix="x",suffix=NULL,index=seq_along(tbl_vars(tbl))){ 
    newnames <- tbl_vars(tbl) # Get old variable names 
    names(newnames) <- newnames 
    names(newnames)[index] <- paste0(prefix,".",newnames,suffix)[index] # create a named vector for .dots 
    rename_(tbl,.dots=newnames) # rename the variables 
} 

Ví dụ sử dụng (Giả auth_users beeing một đối tượng tbl_sql):

auth_user %>% tbl_vars 
tbl.renamer(auth_user) %>% tbl_vars 
auth_user %>% tbl.renamer %>% tbl_vars 
auth_user %>% tbl.renamer(index = c(1,5)) %>% tbl_vars 
3

Tính đến tháng 2 năm 2017, bạn có thể làm điều này với lệnh dplyr rename_(...).

Trong trường hợp ví dụ này bạn có thể làm.

dat14 %>% 
    group_by(class) %>% 
    select(-ID) %>% 
    summarise_each(funs(mean(.))) %>% 
    rename_(names(.)[-1], paste0(names(.)[-1],"_mean_2014"))) 

này là khá tương tự như câu trả lời với set_names nhưng làm việc với tibbles quá!

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