首页 > 解决方案 > 计算并附加列中相等字符串的日期差异

问题描述

我有一个数据框,其中包含一个名称变量,其中有不同的重复字符串,然后是一些数字变量和一个日期变量。首先,我试图找出是否可以为所有具有相同值的字符串创建一个新列,从每隔一个日期减去最低日期,因此有一个数值(天)。如果可能的话,我想将选择的数字变量之一与新的日变量相关联,但再次聚合到相同的字符串值或“人”。关于这一点,我不介意在字符串的每一行中列出相关的结果,因为无论如何我稍后都会聚合字符串。我知道这可能听起来很令人困惑,我希望我设置的小例子已经包含“正确”的值,

names <- c("Richard", "Richard", "Mortimer", "Mortimer", "Mortimer", "Elizabeth", "Elizabeth")
num1 <- c(0.8, 0.1, 0.8, 0.9, 0.2, 0.2, 0.4)
num2 <- c(0.6, 0.3, 0.8, 0.8, 0.5, 0.5, 0.3)
num3 <- c(0.5, 0.4, 0.4, 0.5, 0.8, 0.6, 0.5)
date <- c("2016-08-09", "2014-07-16", "2014-05-17", "2014-04-17", "2013-04-13", "2013-04-10", "2013-04-01")

myframe <- data.frame(names, num1, num2, num3, date)

dayssignedin <- c(755, 0, 399, 369, 0, 9, 0)

desiredoutput1 <- data.frame(myframe, dayssignedin)

num1correlates <- c(1,1, 0.9800646, 0.9800646, 0.9800646, -1, -1)

desiredoutputfinal <- data.frame(desiredoutput, num1correlates)

标签: rdataframedplyrtime-series

解决方案


使用dplyr一种方法是转换date为 Date 对象,减去每个日期datemin最大日期names,然后计算 和 之间的相关num1dayssignedin

library(dplyr)

myframe %>%
  mutate(date = as.Date(date)) %>%
  group_by(names) %>%
  mutate(dayssignedin = as.integer(date - min(date)), 
         num1correlates = cor(num1, dayssignedin))

#  names      num1  num2  num3 date       dayssignedin num1correlates
#  <fct>     <dbl> <dbl> <dbl> <date>            <int>          <dbl>
#1 Richard     0.8   0.6   0.5 2016-08-09          755          1    
#2 Richard     0.1   0.3   0.4 2014-07-16            0          1    
#3 Mortimer    0.8   0.8   0.4 2014-05-17          399          0.980
#4 Mortimer    0.9   0.8   0.5 2014-04-17          369          0.980
#5 Mortimer    0.2   0.5   0.8 2013-04-13            0          0.980
#6 Elizabeth   0.2   0.5   0.6 2013-04-10            9         -1    
#7 Elizabeth   0.4   0.3   0.5 2013-04-01            0         -1    

推荐阅读