【问题标题】:R - How to calculate with values by different minutes per hour within the same columnR - 如何在同一列中按每小时不同的分钟数计算值
【发布时间】:2019-07-02 23:18:36
【问题描述】:

尊敬的 Stackoverflow 社区,

我有一个数据集,其中包含日期时间 [posixct '%d.%m.%Y %H:%M'] 和 [A] 和 [V] 中的传感器测量值。 日期时间是一列,不同的传感器是其他列,每个传感器一列。

我想用每个传感器列内的值计算一个校正值。 校正值应每小时写入一个新列。 因此我想计算修正如下:

校正 = |x - (0.5 * (y+z))|

x= 传感器 1 的值,如果 Minute =='00'

y= 传感器 1 的值,如果 Minute =='03'

z= 传感器 1 的值,如果 Minute =='06'

我想要的是一个函数,它计算每小时的书面公式,但前提是给出一个小时内所有三分钟的值('00'&'03'&'06')并将校正值写入新列(Data$correction)。 我希望我能解释一下,我想做什么。

我尝试了几个循环以及应用和映射函数,但日期格式或函数总是有问题。 这对我来说似乎是最好的方法,虽然它现在不起作用,但我希望有办法让它开始工作。 我还认为,写出向量并将它们与 melt 或 merge 合并可能不是最好的方法。但现在我只是在苦苦挣扎,现在不知道如何解决这个问题。

我真的希望你能帮助我。非常感谢。

Test_sub <- read.table(file= 'Test_sub.csv',
header=T, sep= ';', dec='.', stringsAsFactors= F)

sensor1_V_0 <- Test_sub[format(Test_sub$Datehour, format = '%M') ==           '00',]
sensor1_V_3 <- Test_sub[format(Test_sub$Datehour, format = '%M') == '03',]
sensor12_V_6 <- Test_sub[format(Test_sub$Datehour, format = '%M') == '06',]

test_sub2<- mapply(function(x, y, z) x-(0.5*(y+z)), sensor1_V_0$sensor1_V,     sensor1_V_3$sensor1_V, sensor1_V_6$sensor1_V)

【问题讨论】:

  • 此外,我想加载数据集 (.csv),但我找不到方法,该怎么做。也许有人可以链接帮助,其中对此进行了解释。再次感谢!
  • 你的意思是read.csv()?
  • 其实我的意思是我想在 stackpverflow 上加载数据集。
  • 在此处加载数据可能会有所帮助。但我在这里找不到附加一些数据的按钮。我已经知道如何在 R 中加载数据,但谢谢。
  • 您无法加载堆栈溢出的数据。您可以使用dput(head(data, 20)) 提供数据样本。

标签: r date posixct


【解决方案1】:

让我们从创建一些假数据开始:

dill<-data.frame(time=seq(as.POSIXct("2019-01-01 11:30"), as.POSIXct("2019-01-01 13:20"), by=180),val=runif(37,0,100))

现在我们可以这样做了:

require(tidyverse)
require(lubridate)
dill<- dill %>% 
group_by(hour(time)) %>% # group by the hour -- note this assumes there's only one day in the data, you'll need to adjust this if there's more than one day
filter(any(minute(time)==3) & any(minute(time)==6) & any(minute(time)==0)) %>% # remove any hours in the data that don't have minutes 0, 3 and 6
mutate(correction=abs(val[minute(time)==0]-0.5*(val[minute(time)==3]+val[minute(time)==6]))) # calculate the correction

【讨论】:

  • 首先。非常感谢您的回答。我试过你的代码。但是,即使我使用示例数据框“dill”,R 也会给我以下错误消息 mutate_impl(.data, dots) 中的错误:评估错误:找不到函数“小时”。我看不出这是什么问题
  • 对不起,我的错 - 忘了包括 require(lubridate)。现已修复。
  • 非常感谢您的快速回答。它现在正在工作。但我想知道,是否有可能将数据写到同一数据集的新列中,因为稍后我需要校正值来对整个数据集进行后续计算。不幸的是,简单的分配不起作用。我试过: dill$correction % 等等...
  • 稍后我想将子集合并回原始数据框 dill 以计算所有值。正因为如此,我的方法是,编写一个与“if-else”循环结合的“for-loop”,它应该将校正值写入一个新的列“校正”,因为我必须“按小时计算几个值” “ 之后。因此,每次我必须计算一个新值时,我都可以简单地调整循环
  • 这就是为什么我更喜欢循环的原因。你有一个想法,如何用循环来做到这一点,因为稍后我想计算分钟'03'的值和'校正值'之间的差异。
【解决方案2】:

数据示例如下:

y <- seq(from= 0.1, to= 0.5, by= 0.1)
min <- as.POSIXct('2018-09-25 09:00:00')
max <- as.POSIXct('2018-09-26 17:45:00')
SEQ <- data.frame(Datehour = seq.POSIXt(min,max, by = 60*03))
str(SEQ)
SEQ <- data.frame(SEQ[format(SEQ, format = '%M') == '00' | 
                                format(SEQ, format = '%M') == '03' |
                                format(SEQ, format = '%M') == '06' |
                                format(SEQ, format = '%M') == '15' |
                            format(SEQ, format = '%M') == '30' |
                            format(SEQ, format = '%M') == '45' ,])

data <- data.frame(Datehour=SEQ, y = 0.1, z= 0.3)

【讨论】:

    猜你喜欢
    • 2018-11-29
    • 1970-01-01
    • 2019-07-03
    • 2015-11-18
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多