如何添加许多变量的值?
如果我只有两个变量(列),我可以简单地去:
summation.variable <- variable1 + variable2
或者它是否全部在数据框中:
transform(dataframe, summation.col = column1 + column2)
如果我有大约10个变量并且我不想像在col1 + col2 + col3 + col4中那样输入每个变量,我该怎么做呢。更糟糕的是,我的列有很长的名称,有时我使用的确切列可能会改变。我有一个包含所有相关列名的字符向量,但无法思考如何使用它。
以下内容无用,因为它会在每一行的每一列中添加每个值,并为整个批次提供单个值。
sum(metrics)
答案 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)
在RSeek的rowProd上,我找到了两个包 - matrixStats和fUtilities。你可以看看它们。
第二种解决方案有点棘手。您可以创建表达式并对其进行评估。
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
)
一些解释:
对于原始问题,您可以使用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
我在源代码中挖掘了这些功能,并且:
速度测试:
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。