添加多个列,使用多个变量进行转换

时间:2009-09-22 02:12:26

标签: r

如何添加许多变量的值?

如果我只有两个变量(列),我可以简单地去:

summation.variable <- variable1 + variable2

或者它是否全部在数据框中:

transform(dataframe, summation.col = column1 + column2)

如果我有大约10个变量并且我不想像在col1 + col2 + col3 + col4中那样输入每个变量,我该怎么做呢。更糟糕的是,我的列有很长的名称,有时我使用的确切列可能会改变。我有一个包含所有相关列名的字符向量,但无法思考如何使用它。

以下内容无用,因为它会在每一行的每一列中添加每个值,并为整个批次提供单个值。

sum(metrics)

4 个答案:

答案 0 :(得分:8)

您想使用rowSums(请参阅使用字符向量建立索引。)

tmp <- data.frame(a=1:2,b=3:4,d=5:6)
rowSums(tmp[,c("a","d")])

或更一般地说,适用:

apply(tmp[,c("a","d")], 1, sum)

答案 1 :(得分:4)

有很多方法可以进行这种操作(即在行或列中应用函数),但正如Eduardo指出的那样,apply是最基本的:

tmp <- data.frame(a=1:2,b=3:4,d=5:6)
apply(tmp, 1, prod)

这是一个非常灵活的功能。例如,您可以使用此调用立即执行两个操作:

apply(tmp, MARGIN=1, function(x) c(sum(x), prod(x)))

跨列执行相同的分析也很简单(MARGIN参数描述您是使用行还是列):

apply(tmp, MARGIN=2, function(x) c(sum(x), prod(x)))

答案 2 :(得分:3)

回答Farrel answer

RSeek的rowProd上,我找到了两个包 - matrixStatsfUtilities。你可以看看它们。

第二种解决方案有点棘手。您可以创建表达式并对其进行评估。

X <- structure(list(
    varA = c(0.98, 0.75, -0.56, -1.43, 0.65, -1.15, -1.52, 0.1, 0.06, 0.76),
    varB = c(-0.12, -0.6, 0.62, 0.9, -0.44, 0.37, 0.62, 0.76, -1.61, -0.26),
    varC = c(-0.5, -0.37, -0.43, -0.7, 0.83, -0.24, -0.57, 0.05, -1.31, 0.7),
    varD = c(-0.06, -0.11, 1.03, -1.76, -0.42, -1.21, -0.62, -1, -1.16, 2.13),
    varE = c(-1.96, 0.69, -1.85, -1.74, -1.47, 1.24, 0.29, -1.18, 0.89, 0.42),
    varF = c(0.29, -0.22, -1.29, 1.19, 0.38, -0.23, -0.5, -1.07, -1.83, 0.58),
    varG = c(0.59, -0.41, -1.37, 0.89, -0.75, 0.95, 0.95, -0.9, 0.71, -1.3)
  ),
  .Names = c("varA", "varB", "varC", "varD", "varE", "varF", "varG"),
  row.names = c(NA, -10L), class = "data.frame"
)

metrics <- c("varB","varC","varF")

eval(
  parse( text = paste(metrics,collapse=" * ") ),
  envir = X
)

一些解释:

  • paste创建一个看起来像varB * varC * varF的字符串(折叠用于连接向量的元素)
  • 解析是将文本转换为表达式
  • eval with envir = X是在X
  • 中执行表达式

对于原始问题,您可以使用collapse =“+”。

编辑:如果您的变量不在data.frame中,那么没有envir的eval就足够了。

edit2:使用上述软件包中的rowProds的示例:

matrixStats::rowProds(as.matrix(X[,metrics])) # convert to a matrix is needed
fUtilities::rowProds(X[,metrics]) # without conversion

我在源代码中挖掘了这些功能,并且:

  • fUtilities use apply,所以这与apply(X,1,prod)相同(这不是高效的洗脱)
  • matrixStats很聪明,可以像exp(rowSums(log(X))这样做,所以应该更快。

速度测试:

Xm <- matrix(rnorm(50000*8),ncol=8)
Xd <- as.data.frame(Xm)

require(fUtilities)
require(matrixStats)
system.time( matrixStats::rowProds(as.matrix(Xd)) ) 
#   user  system elapsed 
#   0.08    0.02    0.09 
system.time( matrixStats::rowProds(Xm) )
#   user  system elapsed 
#   0.08    0.00    0.08 
system.time( fUtilities::rowProds(Xd) )
#   user  system elapsed 
#   0.52    0.00    0.52 

即使转换为矩阵matrixStats版本也更快。

答案 3 :(得分:1)

我得到了答案。我知道我想要一些总和。我去了R帮助查找“总和”。在那里我找到了它。 答案是按照“colSums”链接到“rowSums”。 因此,度量标准是相关列名称的字符向量。以下行生成一个向量,其中所有数字都添加到每一行。

rowSums(data.frame[metrics])

如果一个人希望每个价值相互成倍,他们会怎么做?我没有看到rowProducts。