2016-04-26 101 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

編輯:

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

如果姓名的排列順序不是x,你可能會得到一些意想不到的結果(例如,你冒着用'low'替換'high'的東西] – Cath

+0

@Cath很好的結果,我們將等待OP到更新數據... – zx8754

+1

done ;-),可能是'colnames(df)< - sub(paste0(「net_(」,paste(x,collapse =「|」),「)_mptc」),「bill _ \\ 1_F「,colnames(df))'會做到這一點 – Cath