有没有我可以用来整理这段代码的循环?

时间:2018-10-31 14:30:33

标签: r loops

replace.value(zdata, c(1), DL[1], 0)  
replace.value(zdata, c(2), DL[2], 0)  
replace.value(zdata, c(3), DL[3], 0)  
replace.value(zdata, c(4), DL[4], 0)  
replace.value(zdata, c(5), DL[5], 0)  
replace.value(zdata, c(6), DL[6], 0)  
replace.value(zdata, c(7), DL[7], 0)  
replace.value(zdata, c(8), DL[8], 0)

我需要为数据帧的每一列将特定值(在DL向量中给出)更改为0。例如,DL向量的第一个值为0.5,因此上面代码的第一行在数据帧的第一列中每0.5更改为0。

2 个答案:

答案 0 :(得分:2)

是的。让我们进行一些改进。首先,public class FundingRequestData { private ArrayList<FundingRequest> fundingRequests; private ArrayList<FixedFundingRequest> fixedFundingRequests; private ArrayList<TrackerFundingRequest> trackerFundingRequests; private static FundingRequestData instance = new FundingRequestData(); public static FundingRequestData getInstance() { return instance; } public FundingRequestData() { this.fundingRequests = new ArrayList<>(); this.fixedFundingRequests = new ArrayList<>(); this.trackerFundingRequests = new ArrayList<>(); } public FundingRequestData(ArrayList<FundingRequest> fundingRequests) { // loop through objects & use add methods to initialise arrays } public void add(FixedFundingRequest newFundingRequest) { this.fundingRequests.add(newFundingRequest); this.fixedFundingRequests.add(newFundingRequest); } public void add(TrackerFundingRequest newFundingRequest) { this.fundingRequests.add(newFundingRequest); this.trackerFundingRequests.add(newFundingRequest); } public ArrayList<FundingRequest> getFundingRequests() { return fundingRequests; } public ArrayList<FixedFundingRequest> getFixedFundingRequests() { return fixedFundingRequests; } public ArrayList<TrackerFundingRequest> getTrackerFundingRequests() { return trackerFundingRequests; } } 代表 concatenate ,意思是“把东西粘在一起”。如果只有一件事,则不需要c()c()5相同,c(5)"hello"相同,依此类推。

c("hello")循环可让您循环特定的值。您在每行代码中更改的值从1到8,因此我们将对其进行循环:

for

我不知道for (val in 1:8) { replace.value(zdata, val, DL[val], 0) } 函数(并且您没有提到它所在的包),但是您没有分配结果似乎很奇怪。在基数R中,您将执行以下操作:

replace.value

使用zdata[1][zdata[1] == DL[1]] <- 0 zdata[2][zdata[2] == DL[2]] <- 0 ... 分配结果,以便将其保存。那会变成这个for循环:

<-

答案 1 :(得分:0)

如果您想更明确地使用tidyverse,可以使用类似walk

library(tidyverse)
walk(1:8, ~replace.value(zdata, .x, DL[.x], 0))