2015-05-27 56 views
4

我有以下的數據幀R:colSums當不是所有列是數字

Type CA AR 
alpha 1 5 
beta 4 9 
gamma 3 8 

我想列和行的總和,使得它看起來像這樣:

Type CA AR Total 
    alpha 1 5 6 
    beta 4 9 13 
    gamma 3 8 11 
    Total 8 22 30 

我能夠做rowSums(如上所示)我猜是因爲它們都是數字。

colSums(df) 

但是,當我做colSums時,我得到錯誤'x必須是數字'。我意識到這是因爲「類型」列不是數字。

如果我做了下面的代碼,這樣我嘗試打印值到第4行(只有通過第四列第二相加)

df[,4] = colSums(df[c(2:4)] 

然後我得到一個錯誤,更換不與數據大小相同。

有誰知道如何解決這個問題?我想打印第2-4列的列總數,並將第1列總計留爲空白或允許我打印「總計」?

在此先感謝!

+0

他們不是'colSums'而是'rowSums'! –

+2

錯誤是因爲你要求R將一個'n'列對象與一個'n-1'向量綁定在一起,並且由於長度差異,R可能不知道熱來計算這個對象。試試這個'data [4,] < - c(NA,colSums(data [,2:3]))' – SabDeM

+0

錯誤是因爲行不是列。沒有'n'與'n-1'的概念問題。想象一下有20行5列的數據框。 –

回答

2

用途:

df$Total <- df$CA + df$AR 

一個更通用的解決方案:

data$Total <- Reduce('+',data[, sapply(data, is.numeric)]) 

編輯:我知道我完全誤解了這個問題。你確實在尋找行的總和,我給了列的總和。

要做到行,而不是:

data <- data.frame(x = 1:3, y = 4:6, z = as.character(letters[1:3])) 
data$z <- as.character(data$z) 
rbind(data,sapply(data, function(y) ifelse(test = is.numeric(y), Reduce('+',y), "Total"))) 
1

如果您不知道哪些列是數字,而是希望跨行的款項然後做到這一點:

df$Total = rowSums(df[ sapply(df, is.numeric)]) 

is.numeric功能返回一個對選擇列有效的邏輯值,sapply將返回邏輯值作爲向量。 要添加一組列總計和總計我們需要從正在建設中的一個因素倒退到數據集創建點,防止「類型」列:

dat <- read.table(text="Type CA AR 
alpha 1 5 
beta 4 9 
gamma 3 8 ",stringsAsFactors=FALSE) 

dat$Total = rowSums(dat[ sapply(dat, is.numeric)]) 

rbind(dat, append(c(Type="Total"), 
        as.list(colSums(dat[ sapply(dat, is.numeric)])))) 
#---------- 
    Type CA AR Total 
1 alpha 1 5  6 
2 beta 4 9 13 
3 gamma 3 8 11 
4 Total 8 22 30 

這是一個data.frame :

> str(rbind(dat, append(c(Type="Total"), as.list(colSums(dat[ sapply(dat, is.numeric)]))))) 
'data.frame': 4 obs. of 4 variables: 
$ Type : chr "alpha" "beta" "gamma" "Total" 
$ CA : num 1 4 3 8 
$ AR : num 5 9 8 22 
$ Total: num 6 13 11 30 
+0

我認爲我們誤解了這個問題。 user4918087正在尋找列總和,而不是行數。請注意底部的總數 – Chris

3

結帳numcolwise()在plyr包。

library(plyr) 

df <- data.frame(
    Type = c("alpha", "beta", "gamme"), 
    CA = c(1, 4, 3), 
    AR = c(5, 9, 8) 
) 

numcolwise(sum)(df) 

結果:

CA AR 
1 8 22 
+0

引發錯誤。 –

+0

它不應該。嘗試我剛剛發佈的可重複的示例。 – aaronwolen

+0

我得到這個錯誤; 'Match.fun(FUN)中的錯誤: '2.55108265612583e + 24'不是函數,字符或符號' –

4

使用matrix

m <- as.matrix(df[,-1]) 
rownames(m) <- df$Type 
#  CA AR 
# alpha 1 5 
# beta 4 9 
# gamma 3 8 

然後加邊距:

addmargins(m,FUN=c(Total=sum),quiet=TRUE) 
#  CA AR Total 
# alpha 1 5  6 
# beta 4 9 13 
# gamma 3 8 11 
# Total 8 22 30 

的簡單addmargins(m)也可以,但是默認的標籤與「總和」的利潤率。

+1

哦,不好意思,因爲我聽不懂噪音有什麼不同。 –

4

你是對的,這是因爲第一列不是數字。

嘗試使用第一列rownames:

df <- data.frame(row.names = c("alpha", "beta", "gamma"), CA = c(1, 4, 3), AR = c(5, 9, 8)) 
df$Total <- rowSums(df) 
df['Total',] <- colSums(df) 
df 

輸出將是:

 CA AR Total 
alpha 1 5  6 
beta 4 9 13 
gamma 3 8 11 
Total 8 22 30 

如果需要的話「類型」,只是刪除rownames並添加列回:

Type <- rownames(df) 
df <- data.frame(Type, df, row.names=NULL) 
df 

而且它的輸出:

Type CA AR Total 
1 alpha 1 5  6 
2 beta 4 9 13 
3 gamma 3 8 11 
4 Total 8 22 30 
0

我想這應該解決您的問題

x<-data.frame(type=c('alpha','beta','gama'), x=c(1,2,3), y=c(4,5,6)) 
x[,'Total'] <- rowSums(x[,c(2:3)]) 
x<-rbind(x,c(type = c('Total'), c(colSums(x[,c(2:4)])))) 
相關問題