Arrays 数组行计算

Arrays 数组行计算,arrays,r,Arrays,R,我有下表: 数据: 原因是要有更多的动态性,因为列的数量将来可能会发生变化。您可以创建一个漂亮的循环或应用程序来实现这一点,但这里明确指出: # Handling the "r" columns. DF$r1 <- DF$x1 / DF$MeasureX DF$r2 <- DF$x2 / DF$MeasureX DF$r3 <- DF$x3 / DF$MeasureX DF$r4 <- DF$x4 / DF$MeasureX DF$r5 <- DF$x5 / DF$

我有下表:

数据:


原因是要有更多的动态性,因为列的数量将来可能会发生变化。

您可以创建一个漂亮的循环或应用程序来实现这一点,但这里明确指出:

# Handling the "r" columns.
DF$r1 <- DF$x1 / DF$MeasureX
DF$r2 <- DF$x2 / DF$MeasureX
DF$r3 <- DF$x3 / DF$MeasureX
DF$r4 <- DF$x4 / DF$MeasureX
DF$r5 <- DF$x5 / DF$MeasureX

# Handling the "p" columns.
DF$p1 <- DF$x1 / 1
DF$p2 <- DF$x2 / 2
DF$p3 <- DF$x3 / 3
DF$p4 <- DF$x4 / 4
DF$p5 <- DF$x5 / 5

# Taking only the columns we want.
FinalDF <- DF[, c("ID", "r1", "r2", "r3", "r4", "r5", "p1", "p2", "p3", "p4", "p5")]
#处理“r”列。

DF$r1您可以创建一个漂亮的循环或应用程序来实现这一点,但在这里它是明确的:

# Handling the "r" columns.
DF$r1 <- DF$x1 / DF$MeasureX
DF$r2 <- DF$x2 / DF$MeasureX
DF$r3 <- DF$x3 / DF$MeasureX
DF$r4 <- DF$x4 / DF$MeasureX
DF$r5 <- DF$x5 / DF$MeasureX

# Handling the "p" columns.
DF$p1 <- DF$x1 / 1
DF$p2 <- DF$x2 / 2
DF$p3 <- DF$x3 / 3
DF$p4 <- DF$x4 / 4
DF$p5 <- DF$x5 / 5

# Taking only the columns we want.
FinalDF <- DF[, c("ID", "r1", "r2", "r3", "r4", "r5", "p1", "p2", "p3", "p4", "p5")]
#处理“r”列。

DF$r1参数循环允许您使用常量向量进行元素除法。棘手的部分是从列名中提取数字。然后,我按行数重复每个数字以执行第二个除法任务

DF[ ,paste0("r", 1:5)] <- DF[ , grep("x", names(DF) )]/ DF$MeasureX

DF[ ,paste0("p", 1:5)] <- DF[ , grep("x", names(DF) )]/   # element-wise division
                          rep( as.numeric( sub("\\D","",names(DF)[ # remove non-digits
                                         grep("x", names(DF))]  #returns only 'x'-cols
                              ) ), each=nrow(DF) ) # make them as long as needed
#-------------
> DF
  ID MeasureX MeasureY x1 x2 x3 x4 x5 r1 r2 r3 r4 r5 p1  p2        p3   p4  p5
1  1        1        1  1  1  1  1  1  1  1  1  1  1  1 0.5 0.3333333 0.25 0.2
2  2        1        1  0  1  1  1  1  0  1  1  1  1  0 0.5 0.3333333 0.25 0.2
3  3        1        1  1  2  3  3  3  1  2  3  3  3  1 1.0 1.0000000 0.75 0.6

DF[,paste0(“r”,1:5)]参数循环使用常量向量进行元素除法。棘手的部分是从列名中提取数字。然后,我按行数重复每个数字以执行第二个除法任务

DF[ ,paste0("r", 1:5)] <- DF[ , grep("x", names(DF) )]/ DF$MeasureX

DF[ ,paste0("p", 1:5)] <- DF[ , grep("x", names(DF) )]/   # element-wise division
                          rep( as.numeric( sub("\\D","",names(DF)[ # remove non-digits
                                         grep("x", names(DF))]  #returns only 'x'-cols
                              ) ), each=nrow(DF) ) # make them as long as needed
#-------------
> DF
  ID MeasureX MeasureY x1 x2 x3 x4 x5 r1 r2 r3 r4 r5 p1  p2        p3   p4  p5
1  1        1        1  1  1  1  1  1  1  1  1  1  1  1 0.5 0.3333333 0.25 0.2
2  2        1        1  0  1  1  1  1  0  1  1  1  1  0 0.5 0.3333333 0.25 0.2
3  3        1        1  1  2  3  3  3  1  2  3  3  3  1 1.0 1.0000000 0.75 0.6

DF[,paste0(“r”,1:5)]数据的替代方案。表
package:

cols <- names(df[c(4:8)])

library(data.table)
setDT(df)[, (paste0("r",1:5)) := .SD / df$MeasureX, by = ID, .SDcols = cols
          ][, (paste0("p",1:5)) := .SD / 1:5, by = ID, .SDcols = cols]

带有
数据的替代方案。表
包:

cols <- names(df[c(4:8)])

library(data.table)
setDT(df)[, (paste0("r",1:5)) := .SD / df$MeasureX, by = ID, .SDcols = cols
          ][, (paste0("p",1:5)) := .SD / 1:5, by = ID, .SDcols = cols]


你自己已经试过了吗?为什么它不起作用?是的,它是可行的。在可行性或执行方面,您需要什么帮助?这对您来说并不难。这里是一个开始:
DF$r1我在SAS中尝试过这个方法,但是我在R中应用逻辑时遇到了困难,所以我想知道在R中是否有任何关于如何做的建议有很多,但在此基础上,您自己解决问题的一些努力总是值得赞赏的(这不是一个代码编写/翻译服务).你自己已经试过了吗?为什么它不起作用?是的,它是可行的。在可行性或执行方面,您需要什么帮助?这对您来说并不难。这里是一个开始:
DF$r1我在SAS中尝试过这个方法,但是我在R中应用逻辑时遇到了困难,所以我想知道在R中是否有任何关于如何做的建议有很多,但在此基础上,您自己解决问题的一些努力总是值得赞赏的(这不是一个代码编写/翻译服务)。这可以在没有循环/键入所有内容的情况下通过执行
result\r之类的操作来实现。是的,我知道。我只是想让它简单明了,因为OP似乎是R的新手。你是对的,这种计算很简单,虽然我在调查中不清楚,但这是我的错。这里的5列将来可能是25列,所以写所有的语句在代码方面是无效的,我在问题中编辑了它在SAS中的运行方式,抱歉再次遗漏了这一点,这很好,使用BondedDust发布的我上面的解决方案为未来提供更好的规模。这可以在不循环/键入所有内容的情况下通过执行
result\r之类的操作来实现。是的,我知道。我只是想让它简单明了,因为OP似乎是R的新手。你是对的,这种计算很简单,虽然我在调查中不清楚,但这是我的错。这里的5列在将来可能是25列,所以写所有的语句在代码上是无效的,我在问题中编辑了它将如何在SAS中进行,再次抱歉没有写出来。好的,使用BondedDust发布的我上面的解决方案,为未来提供更好的规模。你是对的,我注意到,当想要循环时,让我们假设每次使用不同样本基于不同类型参数的预测模型。在运行循环之前,所有必须声明的列表可能会变得混乱,这对我来说是从SAS转换到R的最大挑战,因为现实情况是,大多数时候代码必须是动态的,并且您会养成这种习惯,因为SAS是一种宏语言。非常感谢您提供的解决方案,做得很好。如果您觉得代码有用,那么惯例是对其进行投票。这对我来说已经不重要了,因为我显然沉迷于回答R问题,但如果你不“玩游戏”,你可能会开始看到人们忽视你的问题。不用担心,这是我的意图,再次感谢你花时间在这件事上你是对的,我注意到当我想循环时,假设每次使用不同样本时,基于不同类型参数的预测模型。在运行循环之前,所有必须声明的列表可能会变得混乱,这对我来说是从SAS转换到R的最大挑战,因为现实情况是,大多数时候代码必须是动态的,并且您会养成这种习惯,因为SAS是一种宏语言。非常感谢您提供的解决方案,做得很好。如果您觉得代码有用,那么惯例是对其进行投票。这对我来说已经不重要了,因为我显然沉迷于回答R问题,但如果你不“玩游戏”,你可能会开始看到人们忽视你的问题。不用担心,这是我的意图,再次感谢你在这方面花时间