2016-04-26 2 views
-2

Я пытаюсь переименовать несколько переменных путем присоединения строки из цикла:Переименование переменной в цикле в R

df <- data.frame(net_low_mptc=1:3, net_medium_mptc=4:6, net_high_mptc=7:9) 
x<-c("low","medium","high") 


for(lvl in x) { 
rename(df, c(sprintf("net_%s_mptc", lvl) = sprintf("bill_%s_F", lvl))) } 

ошибка вызвана выражением Sprintf:

Error: unexpected '=' in: 
"for(lvl in x) { 
rename(df, c(sprintf("net_%s_mptc", lvl) =" 
+3

[Как сделать большой R воспроизводимый пример] (http://stackoverflow.com/questions/5963269) Может быть используйте 'dplyr :: rename_'? – zx8754

+0

Извините, я не следую за этим ... – Sassafras

+0

Добавьте 'dput (head (df_1))' к вашему сообщению, чтобы мы могли воспроизвести одинаковые данные. – zx8754

ответ

1

Я предполагаю, что это то, что он/она пытается сделать:

library(plyr) 

x <- c("low","medium","high") 

for(lvl in x) { 
    df_1 <- rename(df_1, setNames(sprintf("bill_tdcv_%s_F", lvl), sprintf("bill_no_net_tdcv_%s", lvl))) 
} 
+0

Спасибо, это сработало! – Sassafras

2

Edit:

colnames(df) <- sub("net_", "bill_", colnames(df)) 
colnames(df) <- sub("_mptc", "_F", colnames(df)) 

colnames(df) 
# [1] "bill_low_F" "bill_medium_F" "bill_high_F" 

Я предполагаю, что здесь, возможно, попробуйте следующее:

x <- c("low", "medium", "high") 
colnames(df_1)[colnames(df_1) %in% paste0("bill_no_net_tdcv_", x)] <- 
    paste0("bill_tdcv_", x, "_F") 

Возможно, вам будет лучше с регулярным выражением, пожалуйста, предоставьте свои данные.

+1

, вы можете получить какой-то неожиданный результат там, если colnames не в том же порядке, что и x (например, вы рискуете заменить что-то «высоким» чем-то с «низким») – Cath

+0

@ Кат хорошо поймать, мы будем ждать OP до обновить данные ... – zx8754

+1

done ;-) и, возможно, 'colnames (df) <- sub (paste0 (" net_ (", paste (x, collapse =" | "),") _mptc ")," bill_ \\ 1_F ", colnames (df))' сделал бы это – Cath

Смежные вопросы