【问题标题】:Dataframe modification consisting of multiple steps由多个步骤组成的数据框修改
【发布时间】:2021-03-01 21:37:36
【问题描述】:

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

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

第二个基本上是一个记录器数据(因变量),它可能每天有几次测量或没有测量(logger dataset)(data table 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

【问题讨论】:

  • 请使用dput() 包含原始数据。没有最低限度的工作对我们来说很麻烦。
  • 您检查过提供的链接吗?这些是带有 dput() 输出的 pastebin 链接。如果我做错了,请告诉我。
  • 他们又来了。站数据:pastebin.com/jzU1LeZs 记录仪数据:pastebin.com/u4vNVMnG

标签: r dataframe date linear-regression


【解决方案1】:

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

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

然后,我使用函数setkey() 设置合并键。如果您想了解更多关于如何加入工作以及如何使用 data.table 执行这些工作,请参阅this link。如果您想进一步了解data.table的总体情况,可以参考官网here

然后我定义了来自 右外 连接的 data.table final。这样,我将保留对象 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

这有帮助吗?

【讨论】:

  • 你先生真了不起。也感谢教程链接。我一定会看看它们,因为我目前还没有完全理解你的代码是如何工作的,但我会到达那里。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-02-01
  • 2015-10-27
  • 2014-06-18
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
相关资源
最近更新 更多