如何在txt文件中提取内容然后在R中循环

时间:2016-10-19 15:41:21

标签: r loops

我有一个fruit.txt文件。 就像这样:

1.
"No": Apple
price<-c(92, 79, 51)
shop.location<- c(5, 3, 2)
visit.freq<-c(28, 20, 16)

2.
"No": Pear
price<-c(56, 44, 14)
shop.location<- c(4, 5, 6)
visit.freq<-c(24, 67, 23)

3.......

fruit.txt文件中有200个这样的块。

我有另一个value.R代码,就像这样:

## Start


income <- price * visit.freq
compete <- price * shop.location * visit.freq
first.price <- price[1] 
c(first.price, income, compete)
## End

对于fruit.txt中的每个块,我需要输入

price<-c(x, x, x, x, x)
shop.location<- c(x, x, x, x, x)
visit.freq<-c(x, x, x, x, x)

start代码中的incomevalue.R之间。这对我来说将是一项重大任务。所以我想知道是否有任何方便的方法来循环这个过程,谢谢。

我的预期结果是:

 first.price income1 income2 income3 compete1 compete2 compete3
          92    2576    1580     816    12880     4740     1632  
          56    1344    2948     322     5376    14740     1932
           .....................................................
           x       x       x       x        x        x        x

谢谢。

1 个答案:

答案 0 :(得分:0)

每个块总是有5行吗?块之间总会有一条空行吗?如果任何一个答案都是“否”,那么这就变得更加复杂了。

如果块完全匹配上面(包括顺序),那么我建议使用readlines函数读取它,然后将其转换为矩阵,以便每个“变量”是一行,每个块是一列(或者您可以使用子集来获取每个“变量”)。

然后你需要一种方法来提取信息。我建议不要使用parseeval,即使它们可以在这里工作,它们也可能很危险并且很难找到错误。

相反,我会使用gsubfn包,特别是strapply函数。例如,如果数据在字符串矩阵中,那么您可以获得所有价格:

library(gsubfn)
myprices <- strapply(myblocks[3,], '[-0-9.]+', as.numeric)

然后用其他变量做同样的事情。在这种情况下,myprices变量现在将是一个列表,每个元素都是数字向量。

然后您可以使用以下内容循环:

for(i in seq_len(ncol(myblocks)) ) {
  price <- myprices[[i]]
  ...
  income <- price * visit.freq
  ...
}

其中...替换为附加代码。

请记住,循环内部不会发生自动打印,因此您需要告诉它打印结果。

如果你想保存结果,那么

或者可能使用lapplysapply函数代替循环(这意味着将上面的代码包装到函数中)。

修改

由于简单的方法不起作用,我们只需要更具创造性。您仍然可以使用readLines读取所有数据,然后使用grepl来访问一组变量(只要每个块只有一行就像上面的每一个一样,即所有行都有一行分配价格,但只有一行。现在要使用价格:

w <- grepl('^price', myblocks)
myprices <- strapply(myblocks[w], '[-0-9.]+', as.numeric)

并且对于其他行再次提出同样的想法。