[使用R 3.2.2]
我有三个具有相同变量的数据框。我需要修改一些变量的值并更改变量的名称(重命名列)。我不想通过数据框执行此数据框,而是使用循环。
这是我想要运行的代码:
#Change the values of the variables
vlist <- c("var1", "var2", "var3")
dataframe0[,vlist] <- dataframe0[,vlist]/10
dataframe1[,vlist] <- dataframe1[,vlist]/10
dataframe2[,vlist] <- dataframe2[,vlist]/10
#Change the name of the variables
colnames(dataframe0)[colnames(dataframe0)=="var1"] <- "temp_min"
colnames(dataframe0)[colnames(dataframe0)=="var2"] <- "temp_max"
colnames(dataframe0)[colnames(dataframe0)=="var3"] <- "prep"
colnames(dataframe1)[colnames(dataframe1)=="var1"] <- "temp_min"
colnames(dataframe1)[colnames(dataframe1)=="var2"] <- "temp_max"
colnames(dataframe1)[colnames(dataframe1)=="var3"] <- "prep"
colnames(dataframe2)[colnames(dataframe2)=="var1"] <- "temp_min"
colnames(dataframe2)[colnames(dataframe2)=="var2"] <- "temp_max"
colnames(dataframe2)[colnames(dataframe2)=="var3"] <- "prep"
我知道用Stata这样的程序做的逻辑,有一个forvalues循环:
#Change the values of the variables
forvalues i=0/2 {
dataframe`i'[,vlist] <- dataframe`i'[,vlist]/10
#Change the name of the variables
colnames(dataframe`i')[colnames(dataframe`i')=="var1"] <- "temp_min"
colnames(dataframe`i')[colnames(dataframe`i')=="var2"] <- "temp_max"
colnames(dataframe`i')[colnames(dataframe`i')=="var3"] <- "prep"
}
但是,我无法在R中重现它。我该怎么办?提前谢谢!
答案 0 :(得分:1)
我会使用数据框列表,您仍然可以“分割”#39;如果真的需要它:
df1 <- data.frame("id"=1:10,"var1"=11:20,"var2"=11:20,"var3"=11:20,"test"=1:10)
df2 <- df1
df3 <- df1
dflist <- list(df1,df2,df3)
for (i in seq_along(dflist)) {
df[[i]]['test'] <- df[[i]]['test']/10
colnames( dflist[[i]] )[ colnames(dflist[[i]]) %in% c('var1','var2','var3') ] <- c('temp_min','temp_max','prep')
# eventually reassign df1-3 to their list value:
# assign(paste0("df",i),dflist[[i]])
}
使用列表的兴趣在于您可以通过编程方式更轻松地访问它们。
我确实将您的代码从3次调用更改为只有一次,因为colnames
给出了一个向量,您可以将其子集化并在一次传递中替换,这假设您的var1到var3的顺序始终相同。
附录:如果您想要最后一个数据集,可以使用do.call(rbind,dflist)
或data.table
包rbindlist(dflist)
。
有关使用Gregor的回答here
中的data.frames列表的更多详细信息