【问题标题】:Interpolate missing values, and conducting cumulative sum based on other columns in R插入缺失值,并根据 R 中的其他列进行累积和
【发布时间】:2016-07-11 12:40:47
【问题描述】:

我有一个这样的数据框:

wpt    ID   Fuel  Dist  Express   Local
 1     S36   12    1     1         0
 2     S36   14    2     1         0
 inter S36   NA    NA    1         0
 inter S36   NA    NA    1         0
 3     S36   16    4     1         0
 inter S36   NA    NA    0         1
 4     S36   18    6     0         1
 5     S36   22    7     0         1
 6     W09   45    9     1         0
 inter W09   NA    NA    1         0
 inter W09   NA    NA    1         0
 inter W09   NA    NA    1         0
 7     W09   48    14    0         1
 8     W09   50    15    0         1

(1)我想插值和插入值到具有 Fuel 和 Dist 列的 NA 的位置。我将带有“inter”的行与常规编号的“wpt”的开始行和结束行一起视为一个单位。然后进行插值。

预期的输出是这样的:

wpt    ID   Fuel     Dist  Express   Local
 1     S36   12       1     1         0
 2     S36   14       2     1         0
 inter S36   14.6667  2.67  1         0
 inter S36   15.3333  3.33  1         0
 3     S36   16       4     1         0
 inter S36   17       5     0         1
 4     S36   18       6     0         1
 5     S36   22       7     0         1
 6     W09   45       9     1         0
 inter W09   45.75    10.25 1         0
 inter W09   46.50    11.50 1         0
 inter W09   47.25    12.75 1         0
 7     W09   48       14    0         1
 8     W09   50       15    0         1

要清楚,第一段插值是这样计算的:

> seq(14,16,length.out = 4)
[1] 14.00000 14.66667 15.33333 16.00000

(2) 然后我想通过ID得到Express和Local每一类的累计和。预期的输出是这样的:

ID  Cumsum.Fuel  Cumsum.Dist Express  Local
S36    4             3          1       0
S36    5             2          0       1
W09    2.25          3.75       1       0
W09    2             1          0       1

明确,Express 的“S36”的 Cum.sum.Fuel 是 16-12=4。这同样适用于其他人。

提前致谢!!!

【问题讨论】:

  • @akrun,刚刚添加,很抱歉造成混淆。
  • 我更新了帖子,请查收。

标签: r dataframe interpolation


【解决方案1】:

对于您可以使用的第一个任务:

library(zoo)
na.approx(df$Fuel)
 [1] 12.00000 14.00000 14.66667 15.33333 16.00000 17.00000 18.00000 22.00000 45.00000 45.75000
[11] 46.50000 47.25000 48.00000 50.00000

【讨论】:

  • 很高兴知道这个功能!然后如何做累积和..我不知道如何对数据进行子集化。因为我不能简单地按 Express 和 Local 分组。它们应该作为子单元分开。
  • @WhiteBig 我不太明白你是如何计算这些累积总和的。也许你展示了如何在所需的输出中获得这些数字?
【解决方案2】:

要填充这两列,我们可以在按“ID”分组后使用mutate_at

library(dplyr)
library(zoo)
df2 <- df1 %>% 
         group_by(ID) %>% 
         mutate_at(vars(Fuel, Dist), na.approx) 
df2
#     wpt    ID     Fuel      Dist Express Local
#   <chr> <chr>    <dbl>     <dbl>   <int> <int>
#1      1   S36 12.00000  1.000000       1     0
#2      2   S36 14.00000  2.000000       1     0
#3  inter   S36 14.66667  2.666667       1     0
#4  inter   S36 15.33333  3.333333       1     0
#5      3   S36 16.00000  4.000000       1     0
#6  inter   S36 17.00000  5.000000       0     1
#7      4   S36 18.00000  6.000000       0     1
#8      5   S36 22.00000  7.000000       0     1
#9      6   W09 45.00000  9.000000       1     0
#10 inter   W09 45.75000 10.250000       1     0
#11 inter   W09 46.50000 11.500000       1     0
#12 inter   W09 47.25000 12.750000       1     0
#13     7   W09 48.00000 14.000000       0     1
#14     8   W09 50.00000 15.000000       0     1

对于第二部分,

library(data.table)
df2 %>%
   group_by(ID, Express1 = rleid(Express), Local1 = rleid(Local)) %>%
   summarise(Express = first(Express),
             Local = first(Local), 
             Cumsum.Fuel = last(Fuel) - first(Fuel),
             Cumsum.Dist = last(Dist) - first(Dist))  %>%
    ungroup() %>% 
    select(-Express1, - Local1)
#Source: local data frame [4 x 5]
#    ID Express Local Cumsum.Fuel Cumsum.Dist
#  <chr>   <int> <int>       <dbl>       <dbl>
#1   S36       1     0        4.00        3.00
#2   S36       0     1        5.00        2.00
#3   W09       1     0        2.25        3.75
#4   W09       0     1        2.00        1.00

或者我们可以在没有rleid 的情况下执行此操作

df2 %>%
    group_by(ID, Express, Local) %>% 
    summarise(Cumsum.Fuel = last(Fuel) - first(Fuel), 
              Cumsum.Dist = last(Dist) - first(Dist))  

【讨论】:

  • 非常感谢您的意见。向你学习了一些东西!欣赏它。
  • 我注意到我错过了这篇文章中问题的重要部分。我创建了一个新问题,请尽可能提供帮助。
猜你喜欢
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2019-09-11
  • 1970-01-01
相关资源
最近更新 更多