【问题标题】:How to calculate a new column using individual values of other columns in a formula?如何使用公式中其他列的单个值计算新列?
【发布时间】:2020-01-18 04:23:09
【问题描述】:

我有一个数据框,其中有一列 X 如下所示:

    X
1   8
2   4
3   2
4   5
5   3
6   2
7   1
8   5

使用此列中的值,我想创建一个新列 Z,它使用以下公式计算新值: 例如,要计算 Z1,计算如下所示: Z1 的值为 0.005。

同样,Z2 的值为 -0.229,Z3 的值为 0.107。

我希望这个例子能清楚地说明我想为我的新 Z 柱实现什么。 关于如何用 R 轻松解决这个问题的任何想法?也许在循环中?

感谢任何提示!

【问题讨论】:

  • 第 8 个(或 X 的最后一个值)的 Z 的期望值是多少?
  • 如果我理解正确,分子和分母的计算从该行开始直到数据帧的末尾。那是对的吗?对于 Z1,分子如何以 (2-3.75) * (5 - 3.75) 结尾?不应该是(1-3.75) * (5 - 3.75)
  • @Ronak Shah 是的,很抱歉,你是对的!

标签: r


【解决方案1】:

也许以下计算出你想要的 - 至少它再现了你给定的前 3 个数字:

(y$Z <- sapply(seq_len(nrow(y)), function(k) {
  i  <- seq_len(nrow(y))
  j <- seq_len(k)
  sum((y$X[i[-j]-k]-mean(y$X))*(y$X[i[-j]]-mean(y$X))) / sum((y$X-mean(y$X))^2)
}))
#[1]  0.00528169 -0.22887324  0.10739437  0.07746479 -0.29049296 -0.32042254
#[7]  0.14964789  0.00000000

可以改进,不要一次又一次地计算相同的值。

数据:

y <- data.frame(X=c(8,4,2,5,3,2,1,5))

【讨论】:

  • 是的,完美就是这样!非常感谢!
【解决方案2】:

您可以使用 while 循环来实现此目的。

这是虚拟数据:

dat <- data.frame(x=c(8,4,2,5,3,2,1,5))

下面是while循环操作:

func1 <- function(x){
  len <- length(x)
  i <- 1
  z <- vector("integer",length=len)
  d <- (x - mean(x))

  while(i < length(x)){
    z[i] <- sum(d[i]*(x[i+1]-mean(x)))/(sum(d^2))
    i = i + 1
  } 
  return(z)
} 

输出当然是与x 长度相同的返回向量。然后,您可以将 z 附加到原始数据框:

dat$z <- func1(dat$x)

【讨论】:

  • 谢谢,这看起来已经很不错了,但是它没有给我正确的值——可能是因为 x[i+1] 部分必须为每个 z 改变。所以对于 z1 它是正确的,但对于 z2 它需要是 x[i+2] 等等。还是公式中漏掉了这个?
  • @User2010S 你能看到新编辑的代码做了你想要的吗?从这里拿走它应该不难。既然您已经掌握了代码语法,只需按照您的意愿编写公式即可。
  • 它并没有达到我想要的效果。但我会尝试调整它。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
相关资源
最近更新 更多