通过因子总和与空类别

时间:2016-08-05 12:40:12

标签: r dataframe

嗨我正在为98国家运行相同的计算,并且需要偶尔采用(df $ var,df $ vactor,sum)。我使用cut函数创建一个段因子变量,并且需要在稍后的点计算段的总和。这工作正常,但我有顶部段为空的国家,然后我得到总和的顶部段的“NA”。有没有更好的方法来避免这种情况,然后只需在一个额外的命令中用零替换NA?我想保持约的长度。 MWE,我在df2中得到因子水平“C”的NA:

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)

1 个答案:

答案 0 :(得分: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