2016-08-05 58 views
0

嗨,我在98國家運行相同的計算,偶爾需要(df $ var,df $ vactor,sum)。我用cut函數創建了一個細分因子變量,並且需要在稍後的點上逐段計算總和。這工作正常,但我有國家的頂部分段是空的,然後我得到一個「NA」的總和頂部分段。有沒有更好的方法來避免這種情況,然後在附加命令後用零替換NA?我想保持大約的長度。 MWE在那裏我DF2得到一個NA於因子水平「C」:由空白類別的因子總和

df1<-data.frame(val=rep(seq(1:3),4), 
factor=cut(rep(seq(1:3),4),breaks=c(1,2,3,4), include.lowest = TRUE, ordered_results=True , labels=LETTERS[1:3])) 
df2<-data.frame(val=rep(seq(1:4),3), 
factor=cut(rep(seq(1:4),3),breaks=c(1,2,3,4), include.lowest = TRUE, ordered_results=True , labels=LETTERS[1:3])) 

by(df1$val,df1$factor,sum) 
by(df2$val,df2$factor,sum) 

回答

2

可以使用droplevels功能,所以它下降的因素組合在變量和打印和值水平

by(df1$val,droplevels(df1$factor),sum) 
droplevels(df1$factor): A 
[1] 12 
------------------------------------------------------------------------------- 
droplevels(df1$factor): B 
[1] 12 

或者您可以使用ifelse條件

x <- by(df1$val,df1$factor,sum) 
x <- ifelse(is.na(x),"0",x) 
print(x) 
df1$factor 
    A B C 
"12" "12" "0" 

可以使用as.numeric也

by(df1$val,as.numeric(df1$factor),sum) 

as.numeric(df1$factor): 1 
[1] 12 
------------------------------------------------------------------------------- 
as.numeric(df1$factor): 2 
[1] 12 

@麥克建議

by(df1$val,as.character(df1$factor),sum) 

as.character(df1$factor): A 
[1] 12 
------------------------------------------------------------------------------- 
as.character(df1$factor): B 
[1] 12 
+0

你也可以使用'as.character()' –

+0

THX所提出的解決方案。事情是我想總是有相同長度的向量,所以NA被替換爲0.我編輯我的問題 –

+0

ifelse解決方案基本上只是我提出的額外命令 –