如何避免dcast()输出中的NA列?
问题描述:
如何避免NA
列dcast()
从reshape2
封装输出?如何避免dcast()输出中的NA列?
在该虚设示例的dcast()
输出将包括NA
柱:
require(reshape2)
data(iris)
iris[ , "Species2"] <- iris[ , "Species"]
iris[ 2:7, "Species2"] <- NA
(x <- dcast(iris, Species ~ Species2, value.var = "Sepal.Width",
fun.aggregate = length))
## Species setosa versicolor virginica NA
##1 setosa 44 0 0 6
##2 versicolor 0 50 0 0
##3 virginica 0 0 50 0
对于有些类似的用例,table()
确实有一个选项,允许以避免此:
table(iris[ , c(5,6)], useNA = "ifany") ##same output as from dcast()
## Species2
##Species setosa versicolor virginica <NA>
## setosa 44 0 0 6
## versicolor 0 50 0 0
## virginica 0 0 50 0
table(iris[ , c(5,6)], useNA = "no") ##avoid NA columns
## Species2
##Species setosa versicolor virginica
## setosa 44 0 0
## versicolor 0 50 0
## virginica 0 0 50
是否dcast()
有类似的选项可以删除输出中的NA
列?我怎样才能避免NA
列? (此功能有许多被严厉地记录,并且我不能完全把握非常模糊的选项...)
答
library(dplyr)
library(tidyr)
iris %>%
filter(!is.na(Species2)) %>%
group_by(Species, Species2) %>%
summarize(freq = n()) %>%
spread(Species2, freq)
答
一个解决方案,我已经找到了,这我不肯定不高兴,基于在评论中建议的降低NA值的方法。它利用从plyr
在dcast()
的subset
参数与.()
一起:
require(plyr)
(x <- dcast(iris, Species ~ Species2, value.var = "Sepal.Width",
fun.aggregate = length, subset = .(!is.na(Species2))))
## Species setosa versicolor virginica
##1 setosa 44 0 0
##2 versicolor 0 50 0
##3 virginica 0 0 50
对于我的特定目的(自定义函数内)以下工作得更好:
(x <- dcast(iris, Species ~ Species2, value.var = "Sepal.Width",
fun.aggregate = length, subset = .(!is.na(get("Species2")))))
## Species setosa versicolor virginica
##1 setosa 44 0 0
##2 versicolor 0 50 0
##3 virginica 0 0 50
答
你可以重命名的的NA列输出,然后使其成为NULL。 (这对我有用)。
require(reshape2)
data(iris)
iris[ , "Species2"] <- iris[ , "Species"]
iris[ 2:7, "Species2"] <- NA
(x <- dcast(iris, Species ~ Species2, value.var = "Sepal.Width",
fun.aggregate = length))
setnames(x , c("setosa", "versicolor", "virginica", "newname"))
x$newname <- NULL
答
这里是我如何能够绕过它:
iris[is.na(iris)] <- 'None'
x <- dcast(iris, Species ~ Species2, value.var="Sepal.Width", fun.aggregate = length)
x$None <- NULL
的想法是,你与“无”替换所有来港,让dcast创建一个名为“无”,而列比'不适用'。然后,如果不需要,可以在下一步中删除该列。
+0
您可以将代码格式化为代码,使其更易于阅读吗? (缩进4个空格,或者使用'{}'按钮。)另外,请添加一个解释,以便其他人可以更好地理解您的解决方案。 – Robert
你可以做'dcast(na.omit(光圈),种类〜Species2,value.var =“Sepal.Width”)',但这不是很通用的解决方案,如果你有兴趣在其他一些列了。 –
@DavidArenburg确实。我意识到'na.omit(虹膜)式的解决方案,但我正在寻找不同的方法。我并没有包括在这个问题以避免使它太混乱了这个要求...... – landroni
如果我猜的话,我会说这是预期的行为,所以你需要有意识地删除丢失的数据(而不是做不小心)。我会首先选择数据来解决它,所以'iris [!is.na(iris $ Species2),]'。 – Heroka