2015-04-27 63 views
7

問題rowSums上一列

是否有一個功能,或者一種方式來獲得rowSums工作的只有一列?

示例數據

col1 <- c(1,2,3) 
col2 <- c(1,2,3) 
df <- data.frame(col1, col2) 

我可以使用rowSums總結一行中的每個值的兩個或多個所定義的列:

colsToAdd <- c("col1", "col2") 
rowSums(df[,colsToAdd]) 
[1] 2 4 6 

然而,當僅在柱傳遞失敗

colsToAdd <- c("col1") 
rowSums(df[,colsToAdd]) 
Error in rowSums(df[, colsToAdd]) : 
    'x' must be an array of at least two dimensions 

哪ma在rowSums()功能看時KES感:

> rowSums 
function (x, na.rm = FALSE, dims = 1L) 
{ 
    if (is.data.frame(x)) 
     x <- as.matrix(x) 
    if (!is.array(x) || length(dn <- dim(x)) < 2L) 
    ## This line 'stops' the function if only one column is passed 

附加信息

列將由用戶在閃亮應用被選擇並存儲在變量中。這個變量然後傳遞給rowSums。用戶可以選擇一個或多個列。

我可以構造一個ifelse語句來檢查變量的長度,但想知道是否有更好/更優雅/單行的解決方案,我沒有看到?

+6

使用drop = FALSE。即。 'rowsums(df [,colsToAdd,drop = FALSE])' – akrun

+2

如果數據中沒有'NA',比如'Reduce(「+」,df [,colsToAdd] )'這應該是一樣快(如果不是更快)。儘管@akrun明確表示了它。 –

+0

boom - 'drop = FALSE'。謝謝@akrun。你想讓它成爲答案嗎? – tospig

回答

7

你可以嘗試

rowSums(df[,colsToAdd, drop=FALSE]) 

?'[',默認情況下,基於對文檔的

x[i, j, ... , drop = TRUE] 

下降:對於矩陣和數組。如果'TRUE'結果被強制爲 ,則可能的最小維數爲