【问题标题】:Create a vector in a LOOP with more conditions在具有更多条件的 LOOP 中创建向量
【发布时间】:2020-07-29 17:26:27
【问题描述】:

我有一个有点复杂的问题。我有两个数据库BDBD2。对于BD 中的每一行,我想搜索整个BD2 并获取一些信息:Sum, Mean, Sd 等。 使用Sum,我成功地使它工作,但对于Mean, Sd, Median,我想获取向量,然后应用这些函数。

为了更清楚,这里是代码。对于sum,它起作用了。但是我现在想将满足条件的值保存在一个向量中,然后计算Mean,Sd,Median。我试图将向量从基础 BD 中提取出来,但没有任何效果,或者有些棘手,我无法弄清楚。

   for (i in 1:dim(BD)[1])
  
{
  
  for (j in 1:dim(BD2)[1])
    
  {
    
    if((BD$Start.Date[i]<BD2$X_TIMESTAMP[j]) && (BD2$X_TIMESTAMP[j]<BD$End.Date[i]) && (BD$Linea[i]==BD2$Linea[j]))
      
    { 
      vl = BD2$X_VALUE[j]
      BD$vec[i] = paste(BD$vec[i],vl,sep="")
      #vect = as.numeric(BD$vec[i])
      BD$Sum[i] = BD$Sum[i]+ BD2$X_VALUE[j]
      #BD$Average[i] = mean(vect)
      
      
    }
    
  }
  
}

关于我附上照片的数据。这是给 BD 的。

这是针对 BD2 的:

我尝试在for 语句之前创建vec。但它仍然不起作用。 错误总是一样的:Error in $&lt;-.data.frame(*tmp*, "vec", value = list(NULL, NULL, NULL, : replacement has 47 rows, data has 530

【问题讨论】:

  • 如果您可以包含有关两个数据集结构的更多信息可能会有所帮助 - 这些是数据框还是列表? vec 已经是 BD 中的变量名了吗?也许显示每个数据帧中的前几行或str() 的输出?
  • 我添加了更多信息。
  • 如果您包含您想要的输出结果可能会有所帮助:也许尝试创建一个小示例(5 行?)并向我们展示您希望会发生什么?您的数据集的图像有所帮助,但仍不清楚vec 到底是什么或应该是什么样子..

标签: r for-loop vector


【解决方案1】:

您可以结合使用dplyrpurrr 来获取摘要。您可以将 split() 您的 data.frame BD 放入行列表中。然后您可以使用purrr:map() 处理列表中的每个元素(即数据中的行)以在BD2 中查找匹配项并计算一些统计信息。获得统计信息后,您可以使用bind_rows() 重新组合成单​​个 data.frame:

library(dplyr)
library(purrr)

# create a small data example
BD <- data.frame(Start.Date = 1:5,
                 End.Date = 2:6,
                 Linea = c(1, 1, 3, 1, 1))
BD2 <- data.frame(X_TIMESTAMP = c(1.5, 1.5, 2.5, 3.5, 4.5),
                  X_VALUE = c(31, 4, 60, 20, -11),
                  Linea = c(1,1,1,1,1))

BD %>% 
  split(seq(nrow(.))) %>%
  map(function(BD_row_i) {
    # find the timestamps that overlap in BD2
    BD2_matches <- BD2 %>% 
      filter((BD_row_i$Start.Date < X_TIMESTAMP) &
               (BD_row_i$End.Date > X_TIMESTAMP) &
               (BD_row_i$Linea == Linea))
    
    if (nrow(BD2_matches) > 0) {
      # calculate some stats based on these matches
      BD2_matches <- BD2_matches %>%
        summarize(Sum = sum(X_VALUE),
                  Average = mean(X_VALUE),
                  Median = median(X_VALUE),
                  Sd = sd(X_VALUE))
    } else {
      # if no matches, return NAs (blank)
      BD2_matches <- BD2_matches %>%
        summarize(Sum = NA,
                  Average = NA,
                  Median = NA,
                  Sd = NA)
    }
    
    # add these statistics back to your BD_row_i data.frame
    BD_row_i <- cbind.data.frame(BD_row_i, BD2_matches)
    
    # return the updated data frame
    return(BD_row_i)
  }) %>%
  bind_rows()

  Start.Date End.Date Linea Sum Average Median       Sd
1          1        2     1  35    17.5   17.5 19.09188
2          2        3     1  60    60.0   60.0       NA
3          3        4     3  NA      NA     NA       NA
4          4        5     1 -11   -11.0  -11.0       NA
5          5        6     1  NA      NA     NA       NA

【讨论】:

    猜你喜欢
    • 2017-03-20
    • 1970-01-01
    • 2020-06-04
    • 2022-01-08
    • 2017-12-17
    • 2018-12-30
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多