【问题标题】:Unable to get all data joined using merge(..., all=TRUE)?无法使用 merge(..., all=TRUE) 获取所有数据?
【发布时间】:2017-03-12 07:23:25
【问题描述】:

我有两个包含时间序列数据的数据框。

我想按时合并这两个数据。我使用了以下命令:

m=merge(mydata7,mydata1,by="times",all =TRUE)

现在你可以看到它缺少来自mydate1 的时间 07:02 我不明白为什么它缺少这个.. 我希望将数据和缺少的字段都替换为以前的值而不是 NA

这是数据:

mydata1 =
structure(list(times = structure(c(2L, 3L, 4L, 5L, 6L, 7L, 8L, 
9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 1L, 20L, 
21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 
34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L),
.Label = c("4/1/2016 11:02", 
"4/1/2016 7:02", "4/1/2016 7:12", "4/1/2016 7:22", "4/1/2016 7:32", 
"4/1/2016 7:42", "4/1/2016 7:52", "4/1/2016 8:02", "4/1/2016 8:12", 
"4/1/2016 8:22", "4/1/2016 8:32", "4/1/2016 8:42", "4/1/2016 8:52", 
"4/1/2016 9:02", "4/1/2016 9:12", "4/1/2016 9:22", "4/1/2016 9:32", 
"4/1/2016 9:42", "4/1/2016 9:52", "4/4/2016 3:40", "4/4/2016 3:50", 
"4/4/2016 4:00", "4/4/2016 4:10", "4/4/2016 4:20", "4/4/2016 4:30", 
"4/4/2016 4:40", "4/4/2016 4:50", "4/4/2016 5:00", "4/4/2016 5:10", 
"4/4/2016 5:20", "4/4/2016 5:30", "4/4/2016 5:40", "4/4/2016 5:50", 
"4/4/2016 6:00", "4/4/2016 6:10", "4/4/2016 6:20", "4/4/2016 6:30", 
"4/4/2016 6:40", "4/4/2016 6:50", "4/4/2016 7:00", "4/4/2016 7:10", 
"4/4/2016 7:20"), class = "factor"),
Open = c(16.72278698, 15.97135403, 
16.2502484, 16.86737499, 17.38982271, 17.06200904, 16.35144742, 
16.6608737, 17.40656438, 18.19878622, 18.4953396, 17.44738486, 
18.03041568, 17.86379046, 17.37890132, 17.8113319, 18.37371163, 
17.5946693, 17.88193098, 15.26577796, 17.787945, 17.56781029, 
16.61562991, 17.20046034, 17.92410221, 17.90279521, 16.68541461, 
15.6198332, 15.66647794, 15.61947799, 15.91357169, 16.16975574, 
16.10266875, 16.48827516, 16.26887133, 16.00361772, 15.70874174, 
16.33110122, 14.98407633, 14.83423362, 15.43892116, 14.06661966),
High = c(16.61218206, 16.30941276, 16.46179687, 17.73242121, 
17.40803494, 16.69500997, 17.12121055, 17.24161281, 18.02573482, 
18.25816418, 17.89118875, 17.39486004, 18.58667227, 17.75906328, 
18.30440156, 18.18327367, 18.22871169, 17.99796892, 18.28241531, 
17.31179538, 17.50683646, 17.13081502, 17.50058581, 18.17055388, 
17.37001367, 17.70375921, 16.12400885, 17.02340347, 15.91559658, 
16.45389754, 16.048561, 16.51394532, 15.91181307, 15.8907224, 
15.32549299, 16.27648947, 16.27259065, 16.02847019, 15.0412349, 
15.03729263, 14.70711405, 15.76516567),
Low = c(15.82402235, 
15.37087088, 15.75891471, 16.29799388, 16.40233601, 16.21816259, 
16.86277766, 16.46255269, 16.99852627, 17.71896219, 17.77013371, 
16.61218982, 17.7642859, 17.87430506, 17.60668581, 17.78581347, 
16.91537413, 17.02232271, 17.79010116, 15.33341039, 17.26249235, 
17.33426018, 17.39939759, 17.38078114, 17.61103373, 15.63631299, 
16.14795684, 16.17203088, 15.05033241, 15.76103829, 16.40251489, 
16.23931193, 16.34181598, 16.23077018, 15.65055291, 15.80244449, 
16.31863567, 15.59777869, 15.09157678, 14.97958773, 14.67132113, 
15.00236144),
close = c(16.16988373, 16.45107987, 16.0544984, 
17.4521672, 17.1385357, 16.99446459, 16.85593712, 16.39238298, 
18.3873355, 17.43757583, 18.14751919, 17.17169022, 17.48942926, 
18.26623319, 17.72940093, 17.74653901, 17.39591443, 17.02606496, 
18.00364352, 18.07080708, 17.69129909, 16.68539826, 17.83899938, 
17.53001623, 17.07814804, 16.14477252, 15.67105975, 16.01777995, 
16.03061899, 15.77042054, 16.46061514, 16.08259587, 16.06298954, 
16.62616704, 15.44284088, 15.85393503, 16.04520034, 15.0713808, 
15.60909829, 15.39263265, 14.80231501, 15.43489693)),
.Names = c("times", "Open", "High", "Low", "close"),
class = "data.frame", row.names = c(NA, -42L))


mydata7 =
structure(list(times = structure(c(2L, 3L, 4L, 5L, 6L, 7L, 8L, 
9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 1L, 17L, 18L, 19L, 20L, 
21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 
34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L), .Label = c("4/1/2016 11:01", 
"4/1/2016 7:01", "4/1/2016 7:11", "4/1/2016 7:21", "4/1/2016 7:31", 
"4/1/2016 7:41", "4/1/2016 8:21", "4/1/2016 8:31", "4/1/2016 8:41", 
"4/1/2016 8:51", "4/1/2016 9:01", "4/1/2016 9:11", "4/1/2016 9:21", 
"4/1/2016 9:31", "4/1/2016 9:41", "4/1/2016 9:51", "4/4/2016 3:45", 
"4/4/2016 3:55", "4/4/2016 4:05", "4/4/2016 4:25", "4/4/2016 4:35", 
"4/4/2016 4:45", "4/4/2016 5:05", "4/4/2016 5:15", "4/4/2016 6:05", 
"4/4/2016 6:45", "4/4/2016 7:05", "4/4/2016 7:15", "4/4/2016 7:25", 
"4/4/2016 7:35", "4/4/2016 7:45", "4/4/2016 7:55", "4/4/2016 8:15", 
"4/4/2016 8:25", "4/4/2016 8:45", "4/4/2016 8:55", "4/4/2016 9:15", 
"4/4/2016 9:25", "4/4/2016 9:35", "4/4/2016 9:45", "4/4/2016 9:55"
), class = "factor"), Open = c(451.1886228, 449.4212867, 451.4615165, 
451.1482766, 452.3053128, 451.5482317, 454.4575053, 453.9436549, 
453.1828612, 454.4282375, 454.6100063, 453.6519749, 454.0431538, 
452.8947017, 453.4831806, 452.8326541, 455.8985985, 452.2680598, 
453.2629865, 453.4039409, 453.2160163, 452.4927456, 451.8070642, 
449.3808479, 450.6853928, 449.3944732, 447.7458839, 447.6836593, 
448.3455733, 447.9036679, 447.1341682, 447.5492552, 447.7067299, 
448.2253611, 449.2601729, 448.0682437, 448.8729166, 449.2426588, 
450.5222366, 449.4723271, 450.0636792), High = c(450.8124209, 
449.272124, 450.9626045, 451.2204223, 451.9714763, 454.4935027, 
455.5178115, 453.2423269, 453.194444, 454.5951709, 454.1375549, 
453.4393663, 453.9353145, 453.6523212, 452.6024881, 452.9658457, 
455.3084733, 453.2023004, 453.704359, 453.2921532, 453.5388983, 
452.0837367, 451.1964962, 451.7064709, 450.3598393, 449.3812282, 
448.0563508, 448.6560677, 449.8208711, 447.3066134, 447.783045, 
447.6497169, 448.0156386, 448.2689689, 449.1497844, 449.0279737, 
448.5201206, 449.7131206, 449.6174205, 450.2479593, 450.6973705
), Low = c(449.2689228, 449.8494337, 451.4297673, 450.3847865, 
450.8154675, 451.4656641, 454.5929712, 453.8866844, 453.9363161, 
453.7459696, 454.1473172, 452.5797131, 454.4614194, 452.4159312, 
452.4458168, 453.2353506, 452.3642802, 452.3774042, 452.6485611, 
453.3248771, 453.6996322, 451.6874197, 449.8135407, 449.1804997, 
450.4841919, 448.0796094, 447.8684126, 447.7141988, 448.2171119, 
447.906635, 447.2796979, 448.0657512, 447.6734645, 448.3034072, 
449.4600224, 448.0461631, 448.6454065, 448.349104, 450.0543481, 
449.9894413, 449.8236391), close = c(449.2609004, 449.4053531, 
451.1122691, 451.7274693, 451.0326458, 454.3438439, 455.2809649, 
453.6682132, 453.9280758, 454.4603361, 454.204142, 452.6525043, 
453.7623646, 452.3093107, 452.8724432, 452.8153176, 452.3614086, 
453.0984373, 454.1264157, 452.7523412, 452.8282336, 451.0074535, 
450.4822089, 451.5704093, 450.2223655, 448.563143, 448.1693728, 
447.6999038, 448.0967266, 447.0993802, 448.1094835, 448.3651085, 
447.5408461, 447.5243577, 449.1473132, 448.5976211, 448.6235759, 
449.471077, 450.1042492, 450.3559352, 450.2732807)), .Names = c("times", 
"Open", "High", "Low", "close"), class = "data.frame", row.names = c(NA, 
-41L))

【问题讨论】:

  • 它在 data.frame 中的位置更远吗?...您可能希望避免一些痛苦并避免 merge 一起使用,并专注于在 dplyr 中使用连接函数:r4ds.had.co.nz/relational-data.html#mutating-joins跨度>
  • @gjabel 是的,它有很多行。它只是数据框的头部。这意味着我们不能通过合并获得想要的结果?
  • 你可能可以......只是连接函数更快更容易控制。我永远无法完全理解合并帮助文件。
  • 看起来你需要rbind,而不是merge,除非你每个都有相同的时间戳。您在head 中看不到两者,因为没有重叠;另一个 data.frame 中的行进一步向下移动到新列中。
  • dput()您的数据,使其更容易重现。将指针悬停在r 标签上以了解更多信息。

标签: r date join merge na


【解决方案1】:

您实际上并没有像您想象的那样失去4/1/2016 7:02。它实际上仍然存在于第 43 行(使用您问题中的示例数据——这可能是您实际数据中的不同行号)。

混淆似乎来自连接(合并)的工作方式。您正在加入times 列,并且由于没有times 的日期/时间值在两个数据集中完全相同,因此您拥有所有记录,但第一个数据集 (mydata7) 中的列总是NA 当来自第二个数据集 (mydata1) 的值存在时,反之亦然。

所以当你说:

我希望将数据和缺失的字段都替换为以前的 值不是 NA

你的陈述部分说:

我想要两个数据

已经满意了。

你的陈述部分说:

缺失的字段被先前的值而不是 NA 替换

不清楚。您可以通过多种不同方式定义“先前值”。例如,如果您的意思是“上一个非缺失行”中的“上一个”,那么答案是:

for(i in 2:nrow(m)){
  for(j in 2:ncol(m)){
    if(is.na(m[i,j]) & !is.na(m[i-1,j])){
      m[i,j] <- m[i-1,j]
    }
  }
}

但这只会从其中一个数据集中消除NAs,可能不是您的意思。

您可能是指基于日期/时间的先前非NA 值。

m$times <- lubridate::dmy_hm(m$times) # change factor to date/time

for(i in 1:nrow(m)){
  for(j in 1:ncol(m)){
    if(is.na(m[i,j])){
      if(length(m[m$times == min(m$times[!is.na(m[,j]) & m$times < m$times[i]]),j]) > 0){
      m[i,j] <- m[m$times == min(m$times[!is.na(m[,j]) & m$times < m$times[i]]),j]
      }
    }
  }
}

这将适用于除 1 行之外的所有行,其中时间戳处于其最小值,因此没有用于填充 NA 值的先前值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 2013-11-24
    • 2019-02-14
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多