读取有关r中行数不同的数据集时出错?

时间:2014-10-14 21:50:40

标签: r row

我有一个名为d857的数据集,包含大约90000行2个变量。这是d857的一个例子:

             datetime  light
1 2013-05-21 23:10:27 10.220
2 2013-05-21 23:15:27  7.949
3 2013-05-21 23:20:27  5.678
4 2013-05-21 23:25:27  3.407
5 2013-05-21 23:30:27  3.407 

我正在尝试从Geolight包中执行twilightCalc功能。当我执行该功能时,我收到错误:

Error in data.frame(id = 1:nrow(smooth), smooth) : 
  arguments imply differing number of rows: 2, 0

我在d857的不同部分执行了该功能,并且有不同的结果。该函数适用于d857[1:27873,],但在该数字之后的任何部分都会收到错误,但也适用于d857[80000:90000,]。我在其文件中检查了数据集,但没有看到任何与众不同的值。什么可能导致此错误,我该如何解决?

编辑:

这是d857 [27870:27880,]和sapply函数。

> d857[27870:27880,]
                 datetime    light
27870 2013-08-26 17:35:27 1163.944
27871 2013-08-26 17:40:27 1163.944
27872 2013-08-26 17:45:27 1163.944
27873 2013-08-26 17:50:27 1163.944
27874 2013-08-26 17:55:27 1163.944
27875 2013-08-26 18:00:27 1163.944
27876 2013-08-26 18:05:27 1163.944
27877 2013-08-26 18:10:27 1163.944
27878 2013-08-26 18:15:27 1163.944
27879 2013-08-26 18:20:27 1163.944
27880 2013-08-26 18:25:27 1163.944

> sapply(d857$datetime, twilightCalc)
Error in data.frame(datetime = as.POSIXct(as.character(datetime), "UTC"),  : 
  argument "light" is missing, with no default

1 个答案:

答案 0 :(得分:0)

解决方案涉及在R中添加两行代码以在地理定位器处于活动状态之前删除任何日期并记录转换数据。在使用twilightCalc函数之前,在以下代码行中对地理定位器数据类型使用luxTrans函数后:

        final TextBox This = this;
        this.addKeyUpHandler(new KeyUpHandler(){

            public void onKeyUp(KeyUpEvent event) {
                String v = This.getText();
                if(v.equalsIgnoreCase("0.0")){
                    This.setText("");
                    return;
                }
                v = v.replaceAll("\\D+","");  //Get only digits
                v= v.replaceFirst("^0+(?!$)", ""); //remove leading zeros
                if(v.length() > 2){
                    This.setText("$"+v.substring(0, v.length()-2) + "." + v.substring(v.length()-2));
                } else if (v.length() == 2){
                    This.setText("$0." + v);
                } else if (v.length() == 1){
                    This.setText("$0.0"+v);
                }               
            }

        });