【问题标题】:Excel OFFSET function in rr中的Excel OFFSET函数
【发布时间】:2013-02-14 16:12:04
【问题描述】:

我正在尝试从 Excel 中模拟 OFFSET 函数。我知道这可以为单个值完成,但我想返回一个范围。我想返回一组偏移量为 1 且组大小为 2 的值。例如,在第 4 行,我想有一个值为 a 列、第 3 行和第 2 行的组。对不起,但我被难住了。

是否可以使用 cbind 或类似方法将此结果作为另一列添加到数据框中?或者,我可以在矢量化函数中使用它,以便我可以求和或表示结果吗?

样机示例:

> df <- data.frame(a=1:10)
> df
    a
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10 10

> #PROCESS 

> df
    a   b
1   1   NA
2   2   (1)
3   3   (1,2)
4   4   (2,3)
5   5   (3,4)
6   6   (4,5)
7   7   (5,6)
8   8   (6,7)
9   9   (7,8)
10 10   (8,9)

【问题讨论】:

  • 您能更准确地了解您希望答案的样子吗?对于一个(可能稍微小一点)的例子,你可以手动构建你想要的 R 输出吗?
  • embed 函数做你想做的事吗?
  • @GregSnow:不知道,太好了!我已将此作为选项添加到我的答案中。

标签: r excel offset


【解决方案1】:

你想要这样的东西吗?

> df <- data.frame(a=1:10)
> b=t(sapply(1:10, function(i) c(df$a[(i+2)%%10+1], df$a[(i+4)%%10+1])))
> s = sapply(1:10, function(i) sum(b[i,]))
> df = data.frame(df, b, s)
> df
    a X1 X2  s
1   1  4  6 10
2   2  5  7 12
3   3  6  8 14
4   4  7  9 16
5   5  8 10 18
6   6  9  1 10
7   7 10  2 12
8   8  1  3  4
9   9  2  4  6
10 10  3  5  8

【讨论】:

    【解决方案2】:

    这应该可以解决问题:

    df$b1 <- c(rep(NA, 1), head(df$a, -1))
    df$b2 <- c(rep(NA, 2), head(df$a, -2))
    

    请注意,结果必须存在于两列中,因为数据框中的列仅支持简单数据类型。 (除非您想求助于复数。)head 带有负参数从尾部削减参数的否定值,请尝试head(1:10, -2)rep 是重复,c 是连接。 &lt;- 分配会添加一个新列(如果它尚不存在)。

    Excel 所称的 OFFSET 有时也称为滞后

    编辑:按照 Greg Snow 的评论,这里有一个更优雅但也更难理解的版本:

    df <- cbind(df, as.data.frame((embed(c(NA, NA, df$a), 3))[,c(3,2)]))
    

    逐个组件尝试,看看它是如何工作的。

    【讨论】:

    • 太棒了。我可以使用它。鉴于数据帧中简单数据类型的限制,我认为您不会做得更好。感谢您的帮助。
    • @JamesKent:谢谢。我更新了我的帖子,加入了 Greg Snow 的评论。
    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2022-01-15
    • 1970-01-01
    • 2020-10-01
    • 2018-11-28
    • 1970-01-01
    相关资源
    最近更新 更多