【问题标题】:How to implement function across groups and save unique output如何跨组实现功能并保存唯一输出
【发布时间】:2018-03-03 23:15:59
【问题描述】:

这是我的功能:

adjusted <- c()
Adjustment <- function(delta, length) {
adjusted <<- vector_1 + delta*(index <= length)
head(adjusted)
}

这是我想要实现的硬编码示例:

adjusted <- c()
Adjustment <- function(delta, length, group = 1) {
adjusted <<- vector_1[1:100] + delta*(index <= length)
head(adjusted)
}

我想实现一个参数或循环,对输入的组参数值在 vector_1 的相应范围内执行计算。例如,如果我改为输入 group =2,则函数将如下所示:

adjusted <- c()
Adjustment <- function(delta, length, group = 2) {
adjusted <<- vector_1[101:200] + delta*(index <= length)
head(adjusted)
}

实际问题:

我将如何实现这一目标?

我发现 dplyr 包可能对此有用,但我没有成功实施它。

任何见解将不胜感激!

【问题讨论】:

  • group 和您传递给vector_1 的索引之间存在直接映射。你就不能写vector_1[(100*(group-1) + 1):100*group]吗?
  • 你能只添加几行数据和预期的输出吗?我怀疑有一个更简单的解决方案。
  • @ManishSaraswat 如果您点击超链接,您会看到几行数据。
  • @ruaridhw 没有直接映射。
  • 和输出?请参阅本指南以获得快速和合适的解决方案:stackoverflow.com/questions/5963269/…

标签: arrays r function vector dplyr


【解决方案1】:

要获得附图中显示的结果,最简单的解决方案是获取每个区域的最小值并从该区域中的所有条目中减去该最小值,然后加 1:

minimalValues <- tapply(yourData$index_value, yourData$region, min)
index_value2 <- yourData$index_value - minimalValues[yourData$region] + 1

如果你想让这个“模块化”,你可以定义一个类似的函数

resetDate <- function(regn, yourData) {
    vals <- yourData$index_value[yourData$region == regn]
    yourData$index_value[yourData$region == regn] <- vals - min(vals) + 1
}

【讨论】:

    【解决方案2】:

    我不确定delta indexlength 在这里是什么,所以我做了一些假设。 另外,由于您没有提供任何虚拟数据,我已经编造了一些。

    library(tidyverse)
    
    # dummy data
    dts <- rep(1:100,100)
    region <- as.factor(rep(1:100, each = 100))
    vec1 <- 1:10000
    df <- as.data.frame(cbind(dts, region, vec1))
    
    adjusted <- c()
    
    Adjustment <- function(df, index, delta, length, selectRegion= 2) {
      subDf <- df %>%
        filter(region == selectRegion)
      adjusted <<- subDf$vec1 + delta*(index <= length)
      head(adjusted)
    }
    
    Adjustment(df, index = 2, delta = 2, length = 2, selectRegion = 4)
    
    
    ## run function for all levels of selectRegion
    res <- lapply(levels(region), Adjustment, df = df, index = 2, delta = 2, length = 2)
    
    ## add names to list elements
    names(res) <- paste0("adjustment_", 1:length(res))
    
    res
    
    $adjustment_1
    [1] 3 4 5 6 7 8
    
    $adjustment_2
    [1] 103 104 105 106 107 108
    
    $adjustment_3
    [1] 203 204 205 206 207 208
    
    $adjustment_4
    [1] 303 304 305 306 307 308
    
    $adjustment_5
    [1] 403 404 405 406 407 408
    
     Output keeps going to the 100th region. 
    

    【讨论】:

    • 你能解释一下这些因素的重要性吗?另外,让我澄清一下。 length 是一个参数,它对小于或等于 length 的所有元素对原始 vector_1 进行调整。 delta 是如何改变vector_1,无论是加法还是减法。
    • fctr 变量是您的 region 变量,我会在答案中更改它。您可以在我的回答中将deltalength 更改为您喜欢的任何内容。如果您想获得快速准确的帮助,您真的应该遵循这里的指南:stackoverflow.com/questions/5963269/…
    猜你喜欢
    • 2020-01-20
    • 2020-10-22
    • 2023-04-05
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多