在R

时间:2017-07-19 03:27:55

标签: r apply

我是R的新手。我想知道如何以有效的方式编写以下for循环。我通过以下代码获得小数据集的正确答案。

data <- data.frame(x1=c(rep('a',12)),
            x2=c(rep('b',12)),
            x3=c(rep(as.Date('2017-03-09'),4),rep(as.Date('2017-03-10'),4),rep(as.Date('2017-03-11'),4)),
            value1= seq(201,212),
            x4=c(as.Date('2017-03-09'),as.Date('2017-03-10'),as.Date('2017-03-11'),as.Date('2017-03-12')
                 ,as.Date('2017-03-10'),as.Date('2017-03-11'),as.Date('2017-03-12'),as.Date('2017-03-13')
                 ,as.Date('2017-03-11'),as.Date('2017-03-12'),as.Date('2017-03-13'),as.Date('2017-03-14')),
            value2= seq(101,112), stringsAsFactors = FALSE)

下面是循环脚本:

for (i in 1:length(data$x3)){
  print(i)
  if (!is.na(data$x4[i])){
    if(data$x4[i] == data$x3[i] && data$x2[i]==data$x2[i] && data$x1[i]==data$x1[i]){

      data$diff[i] <- data$value1[i] - data$value2[i]
    }
    else{
      print("I am in else")
      for (j in 1:length(data$x3)){
        print(c(i,j))
        # print(a$y[i])
        if(data$x4[i]==data$x3[j] && data$x1[i]==data$x1[j] && data$x2[i]==data$x2[j]){

          # print(a$x[j])
          data$diff[i] <- data$value1[j] - data$value2[i]
          break
        }
      }
    }
  }
}

2 个答案:

答案 0 :(得分:0)

你可以这样做:

data$diff <- sapply(seq_along(data$x3), function(i) {
  if (!is.na(data$x4[i])){
    ind <- which(data$x4[i] == data$x3 & data$x1[i] == data$x1 & data$x2[i] == data$x2)
    j <- `if`(i %in% ind, i, min(ind))
    data$value1[j] - data$value2[i]
  } else {
    NA
  }
})

请注意代码中的 ,如果列$diff尚不存在,执行data$diff[1] <- 100会将列的所有值都放在100。< / p>

答案 1 :(得分:0)

如果你想要表现,答案通常是Rcpp。 在Rcpp中翻译你的R代码:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector f_Rcpp(List data) {

  StringVector      x1 = data["x1"]; 
  StringVector      x2 = data["x2"]; 
  NumericVector     x3 = data["x3"];
  NumericVector     x4 = data["x4"];
  NumericVector value1 = data["value1"];
  NumericVector value2 = data["value2"];

  int n = value1.size();
  NumericVector diff(n, NA_REAL);

  int i, j;

  for (i = 0; i < n; i++) {
    Rprintf("%d\n", i);
    if (x4[i] != NA_REAL) {
      if (x4[i] == x3[i]) {
        diff[i] = value1[i] - value2[i];
      } else {
        Rprintf("I am in else\n");
        for (j = 0; j < n; j++) {
          Rprintf("%d %d\n", i, j);
          if (x4[i] == x3[j] && x1[i] == x1[j] && x2[i] == x2[j]) {
            diff[i] = value1[j] - value2[i];
            break;
          }
        }
      }
    }
  }

  return diff;
}

/*** R
f_Rcpp(data)
*/

将它放在.cpp文件中并获取它。