嗨我正在为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)
答案 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