在R中构建forvalues循环

时间:2017-02-08 14:23:32

标签: r loops stata

[使用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中重现它。我该怎么办?提前谢谢!

1 个答案:

答案 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.tablerbindlist(dflist)

有关使用Gregor的回答here

中的data.frames列表的更多详细信息