【问题标题】:Average n rows for each part and then last n rows for the same part每个部分平均 n 行,然后同一部分的最后 n 行
【发布时间】:2019-07-20 15:18:35
【问题描述】:

我有一个 csv 文件,其中包含大约 10 行输出值以及每个部分的温度测量值。大约有100个零件。但我想要以下内容:

仅平均每个部分的前 3 行,显示部分,平均值,平均温度 同一部分的平均最后 3 行,显示部分,平均值,平均温度

Row#|PartID|Output|Temp(C)
--------------------
  1 |  435 | 70 | 25
  2 |  435 | 30 | 21
  3 |  435 | 20 | 20
  ..|  ... | ...| ...
  8 |  435 | 50 | 10
  9 |  435 | 35 | 15
 10 |  435 | 45 | 20
 11 |  525 | 60 | 25
 12 |  525 | 15 | 20

and so on

mydata <- csv.read("some file.csv", header=T)
# maximum number of rows to evaluate
nmax <- 3
n <- 1
for i in unique(part, margin=1) 
{
  while (n<nmax)
     {
       apply(mydata, 2, mean)
       n = n+1
     }
}

基本上,我的第一部分 ID 的结果应该是:

First Output (Average first 3 rows):

PartID|Output|Temp
 435  |  40  | 23

Second Output (Average last 3 rows):

PartID|Output|Temp
 435  |  43.3| 15

我只展示了评估前 3 行平均值的代码。我是否朝着正确的方向前进?有更好的方法吗?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    使用 dplyr 的一种方法是为每个 PartID 选择前 3 行和后 3 行,每 3 行创建一个额外的组并获取 mean 的列。

    library(dplyr)
    
    df %>%
      group_by(PartID) %>%
      slice(c(1:3, (n()-2):n())) %>%
      group_by(group = rep(c(1, 2),each = 3)) %>%
      #Or group_by(group = gl(n()/3, 3)) %>%
      summarise_all(mean) %>%
      select(-Row, -group)
    
    # A tibble: 2 x 3
    #  PartID Output Temp.C.
    #   <dbl>  <dbl>   <dbl>
    #1    435   40        22
    #2    435   43.3      15
    

    数据

    df <- structure(list(Row = c(1L, 2L, 3L, 4L, 8L, 9L, 10L), PartID = c(435L, 
    435L, 435L, 435L, 435L, 435L, 435L), Output = c(70L, 30L, 20L, 
    20L, 50L, 35L, 45L), Temp.C. = c(25L, 21L, 20L, 20L, 10L, 15L, 
    20L)), row.names = c(NA, 7L), class = "data.frame")
    

    【讨论】:

    • df 中的错误 %>% group_by(PartID) %>% slice(c(1:3, (n() - 2):n())) %>% group_by(group = rep (c(1, : 找不到函数“%>%”
    • @SalN85 您需要为此安装dplyr 包,执行install.packages("dplyr"),然后执行library(dplyr) 并运行上述代码。
    • n() 给出了组中的总行数,所以通过 (n()-2):n()) 我们选择每个 PartID 中的最后 3 行。
    • 第一部分是正确的,对于最后 1000 行,您需要执行 c(1:1000, (n() - 999) : n())。因为 n() -999 会给你 6001 并从那里创建一个序列,直到 n() 是 7000。
    • 是的,但由于我们按PartID 分组,因此每个组的PartID 相同。此外,如果您想将其拆分为不同的数据帧,您可以将%&gt;% group_split(row_number(), keep = FALSE) 添加到当前代码中。
    猜你喜欢
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    相关资源
    最近更新 更多