在执行cbind()时循环R中的一系列变量

时间:2014-12-04 15:37:41

标签: r

我已经通过read.csv读取了R中的数据集,并且在做了一些计算之后创建了以下10个相似名称的变量,PI_1,PI_2,.....,PI_10

现在我将新形成的变量与现有数据集(TempData)合并。

x<-cbind(TempData,PI_1,PI_2,PI_3,PI_4,PI_5,PI_6,PI_7,PI_8,PI_9,PI_10)

有没有更聪明的方法(可能通过循环)。非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

假设文件位于工作目录中,并且所有文件都以PI_开头,后跟一些数字\\d+,我们可以使用带有list.files参数的pattern以防万一目录中还有其他文件。要检查工作目录,请使用getwd()

  files <- list.files(pattern='^PI_\\d+')

这将给出文件名。现在,我们可以使用lapply并使用listread.table中阅读这些文件。有一次,我们完成了该部分,使用do.call(cbind将所有数据集列绑定在一起。

  res <- do.call(cbind,lapply(files, function(x) 
                     read.table(x, header=TRUE)))

更新

我想您需要根据某些10创建PI个变量。在注释中提供的代码中,PI似乎是一个在其中具有一定价值的对象。在这里,我创建PI作为值,因为它不清楚。我创建了一个虚拟数据集。

  TempData[paste0('PI_', 1:10)] <- Map(function(x,y) c('', 'PI')[(x==y)+1],
                                  1:10, list(TempData$Concept)) 

   head(TempData,3)
  #  Concept        Val PI_1 PI_2 PI_3 PI_4 PI_5 PI_6 PI_7 PI_8 PI_9 PI_10
  #1      10 -0.4304691                                                 PI
  #2      10 -0.2572694                                                 PI
  #3       3 -1.7631631             PI                                    

您可以使用write.table保存结果

数据

set.seed(42)
dat <- data.frame(Concept=sample(1:10,50, replace=TRUE), Val=rnorm(50))
write.csv(dat, 'Concept.csv', row.names=FALSE,quote=FALSE)
TempData <- read.csv('Concept.csv')
str(TempData)
#'data.frame':  50 obs. of  2 variables:
# $ Concept: int  10 10 3 9 7 6 8 2 7 8 ...
# $ Val    : num  -0.43 -0.257 -1.763 0.46 -0.64 ...