R,if else语句只返回第二个循环

时间:2017-08-29 17:22:04

标签: r for-loop

我的数据中有一列只有与错误代码时间相对应的分钟。我想创建一个名为i $ rminute的新列,将时间分成四个,十五分钟的间隔。

>for(j in i$rminute) {
  if(i$rminute < 16){
    i$r15intervals <- "1"
  } else if(i$rminute < 31){
    i$r15intervals <- "2"
  } else if(i$rminute < 46){
    i$r15intervals <- "3"
  } else {
    i$r15intervals <- "4"}}


>i$r15intervals <- as.factor(i$r15intervals)


   > summary(i$r15intervals)
    2 
78455 

所以它返回的唯一数字是2,我做错了什么?为什么不创建一个新的列,其中变量1到4对应于每个十五分钟的间隔?

我还是R的新手,我猜我有一些非常明显的错误。

3 个答案:

答案 0 :(得分:1)

您已使用i$r15intervals <- #分配整个列值,因此i$rminute中的最后一个数字可能介于16和31之间。

通过i[j, "intervals"]设置每个行值。

这是另一种没有for循环的方法

i = data.frame(rminute = sample(1:50, 20))


findInterval = function(x){
  if(x< 16){
      return("1")
  } else if(x < 31){
      return("2")
  } else if(x< 46){
      return("3")
  } else {
    return("4")}
}

i$r15interval = sapply(i$rminute, findInterval)

> head(i)
  rminute r15interval
1       1           1
2      47           4
3      25           2
4      41           3
5      16           2
6      44           3

答案 1 :(得分:1)

这将成为您正在寻找的因素:

.filter('parseDate', function () {
    return function (date) {
      if (angular.isDate(date)) return date;
      return new Date(Date.parse(date.replace(/:\d{2}[.,]\d{3}Z$/, '')));
    };
});

var start_time = "2017-08-29T17:15:16.814Z";

$scope.start_date = $filter('parseDate')(start_time);

答案 2 :(得分:0)

使用 cut()功能:

cut(c(20,36,8,47),breaks = c(0,15,30,45,60))

输出是:

[1] (15,30] (30,45] (0,15]  (45,60] 
Levels: (0,15] (15,30] (30,45](45,60]
相关问题