首页 > 解决方案 > 由多个步骤组成的数据框修改

问题描述

我有这两个数据集,我试图将它们用于线性回归。一个包含从气象站测量的每日平均值(自变量)。

date  ST5_mean  ST1_mean  ST0_mean ST10_mean Snowheight Precipitation
1 2014-10-08 11.136713 10.980278 11.333995 11.622550 0.23680556           118
2 2014-10-09  9.255580  8.727486  8.796319 11.635243 0.00000000           124
3 2014-10-10 10.297521  9.441427  9.376736 12.879920 0.00000000           108
4 2014-10-11  9.080031  9.172347  9.389281  9.372538 0.01041667           152
5 2014-10-12 10.059455  9.428875  9.392774 11.866694 0.00000000           425
.
.
.
242 2015-06-06 12.946955 11.979896 11.50326 14.060399 0.00000000           470
243 2015-06-07 12.918128 11.737031 11.17246 13.691757 0.00000000           407
244 2015-06-08 12.214410 11.779344 11.50781 12.370771 0.00000000           100
245 2015-06-09 11.271517 10.942083 10.79751 11.324122 0.00000000            19
246 2015-06-10  8.597696  9.730661 10.20789  8.181455 0.01180556           481

第二个基本上是一个记录器数据(因变量),它可能每天有几个测量值或没有(记录器数据集)(数据表 jpeg)。我需要修改记录器数据,使其与站点数据一致,并且可以对这些数据进行回归(这意味着每天应该有 1 行)。需要对同一天发生的记录仪测量值(“距离”列)进行汇总,以便获得每天的单个值;因此,例如,如果 2014 年 1 月 2 日有 3 个测量值,则值应为 2.355 (3 x 0.785)。此外,我需要为该期间的每一天创建一行以匹配车站数据的样本大小。记录器没有测量值的一天应该是 0。我需要对大量数据集执行这些修改,所以我需要找出一个以自动/半自动方式执行此操作的代码。手动添加数据将是荒谬的,因为数据集最多有几千行。不幸的是,我不能 最近几天没有想出任何有意义的事情。任何帮助表示赞赏。

我希望我设法在这里解释了这个问题。让我知道您是否需要更多说明。提前致谢!

PS我管理了按日期汇总并获得每日总和的第一部分,但是我仍然坚持在给定时间段内为每一天创建一行并为“距离”变量分配0。这就是我到目前为止所拥有的。

startTime <- as.Date("2014-10-08")
endTime <- as.Date("2015-06-10")
start_end <- c(startTime,endTime)
startTime <- as.Date("2014-10-08")
logger1 <- read.csv("124106_106.csv",header=TRUE, sep=",")
logger1$date <- as.Date(logger1$Date, "%d.%m.%Y")
logger1_sum <- aggregate (logger1$Distance, by = list(logger1$date), FUN = sum, na.rm=TRUE)"
names (logger1_sum) <- c("date", "distance")

head(logger1_sum, 5)
       date distance
1 2014-10-02    1.570
2 2014-10-03    3.140
3 2014-10-08    3.925
4 2014-10-23    9.420
5 2014-10-24    3.925

tail(logger1_sum, 5)
        date distance
45 2015-05-26    1.570
46 2015-05-27    1.570
47 2015-05-28    1.570
48 2015-06-10    0.785
49 2015-07-06    1.570

标签: rdataframedatelinear-regression

解决方案


我认为这应该可以完成这项工作。我使用data.table包,它使连接变得超级简单和快速。

为简洁起见,我不报告您的数据,因此您会看到代码开始时就好像loggerand stationdata.frame 已经在环境中一样。代码执行以下操作:它将列DistanceAccuDist(假设这两列是重要的一列)按列相加date,这是在Date类中正确格式化的列。

然后,我使用功能设置合并键setkey()。如果您想了解更多关于如何加入工作以及如何使用 data.table 执行它们的信息,请参阅此链接。如果您想了解更多关于data.table的一般信息,可以参考官方网站

final然后我定义来自右外连接的 data.table 。这样,我将保留 object 中的所有观察结果(即行)station

library(data.table)

# this converts the two data.frame in data.table by reference
setDT(logger)
setDT(station)

# sum Distance by date
logger_summed <- logger[ , .( sum_Distance = sum(Distance), 
                              sum_AccuDist = sum(AccuDist)), by = date]

> head(logger_summed)
##       date    sum_Distance sum_AccuDist
## 1: 2014-10-02        1.570        2.355
## 2: 2014-10-03        3.140       14.130
## 3: 2014-10-08        3.925       35.325
## 4: 2014-10-23        9.420      164.850
## 5: 2014-10-24        3.925      102.050
## 6: 2014-10-25        2.355       70.650


setkey( logger_summed, date )
setkey( station, date )

final <- logger_summed[ station ]
final[ is.na(sum_Distance), `:=` ( sum_Distance = 0, sum_AccuDist = 0) ]

> final
##           date sum_Distance sum_AccuDist  ST5_mean  ST1_mean  ST0_mean ST10_mean Snowheight Precipitation
##  1: 2014-10-08        3.925       35.325 11.136713 10.980278 11.333995 11.622550 0.23680556           118
##  2: 2014-10-09        0.000        0.000  9.255580  8.727486  8.796319 11.635243 0.00000000           124
##  3: 2014-10-10        0.000        0.000 10.297521  9.441427  9.376736 12.879920 0.00000000           108
##  4: 2014-10-11        0.000        0.000  9.080031  9.172347  9.389281  9.372538 0.01041667           152
##  5: 2014-10-12        0.000        0.000 10.059455  9.428875  9.392774 11.866694 0.00000000           425
## ---                                                                                                      
## 242: 2015-06-06        0.000        0.000 12.946955 11.979896 11.503257 14.060399 0.00000000           470
## 243: 2015-06-07        0.000        0.000 12.918128 11.737031 11.172462 13.691757 0.00000000           407
## 244: 2015-06-08        0.000        0.000 12.214410 11.779344 11.507812 12.370771 0.00000000           100
## 245: 2015-06-09        0.000        0.000 11.271517 10.942083 10.797510 11.324122 0.00000000            19
## 246: 2015-06-10        0.785      115.395  8.597696  9.730661 10.207893  8.181455 0.01180556           481

这有帮助吗?


推荐阅读