我有一个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
代码中的income
和value.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
谢谢。
答案 0 :(得分:0)
每个块总是有5行吗?块之间总会有一条空行吗?如果任何一个答案都是“否”,那么这就变得更加复杂了。
如果块完全匹配上面(包括顺序),那么我建议使用readlines
函数读取它,然后将其转换为矩阵,以便每个“变量”是一行,每个块是一列(或者您可以使用子集来获取每个“变量”)。
然后你需要一种方法来提取信息。我建议不要使用parse
和eval
,即使它们可以在这里工作,它们也可能很危险并且很难找到错误。
相反,我会使用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
...
}
其中...
替换为附加代码。
请记住,循环内部不会发生自动打印,因此您需要告诉它打印结果。
如果你想保存结果,那么或者可能使用lapply
或sapply
函数代替循环(这意味着将上面的代码包装到函数中)。
修改强>
由于简单的方法不起作用,我们只需要更具创造性。您仍然可以使用readLines
读取所有数据,然后使用grepl
来访问一组变量(只要每个块只有一行就像上面的每一个一样,即所有行都有一行分配价格,但只有一行。现在要使用价格:
w <- grepl('^price', myblocks)
myprices <- strapply(myblocks[w], '[-0-9.]+', as.numeric)
并且对于其他行再次提出同样的想法。