首页 > 解决方案 > 如何使用 dcast() 函数保持 NA 值?

问题描述

df <- data.frame(x = c(1,1,1,2,2,3,3,3,4,5,5),
                 y = c("A","B","C","A","B","A","B","D","B","C","D"),
                 z = c(3,2,1,4,2,3,2,1,2,3,4))

df_new <- dcast(df, x ~ y, value.var = "z")

如果样本数据如上所示,则 dcast() 函数保持 NA 值。但它不适用于我的数据集。因此,该函数将 na 转换为零。为什么?

如何保持 na 值?

ml-latest-small.zip

r <- read.csv("ratings.csv")
m <- read.csv("movies.csv")
rm <- merge(ratings, movies, by="movieId")
umr <- dcast(rm, userId ~ title, value.var = "rating", fun.aggregate= sum)

提前致谢。

标签: r

解决方案


在第一个示例中,fun.aggregate未调用,但在第二种情况下,更改是fun.aggregate被调用。根据?dcast

library(reshape2)

fill - 用于填充结构缺失的值,默认为将 fun.aggregate 应用于 0 长度向量的值

dcast(df, x ~ y, value.var = "z", fun.aggregate = NULL)
# x  A  B  C  D
#1 1  3  2  1 NA
#2 2  4  2 NA NA
#3 3  3  2 NA  1
#4 4 NA  2 NA NA
#5 5 NA NA  3  4

dcast(df, x ~ y, value.var = "z", fun.aggregate = sum)
#  x A B C D
#1 1 3 2 1 0
#2 2 4 2 0 0
#3 3 3 2 0 1
#4 4 0 2 0 0
#5 5 0 0 3 4

请注意,这里每个组合只有一个元素,因此sum将返回相同的值,但如果不存在特定组合,则返回 0。它基于sum

length(integer(0))
#[1] 0
sum(integer(0))
#[1] 0

sum(NULL)
#[1] 0

或者当所有元素都是NA并且如果我们使用na.rm,将没有任何元素可以求和,那么它也会进入integer(0)模式

sum(c(NA, NA), na.rm = TRUE)
#[1] 0

如果我们使用sum_from hablar,则此行为将更改为 returnNA

library(hablar)
sum_(c(NA, NA))
#[1] NA

fun.aggregate一个选项是在返回中创建一个条件NA

dcast(df, x ~ y, value.var = "z", 
   fun.aggregate = function(x) if(length(x) == 0) NA_real_ else sum(x, na.rm = TRUE))
#  x  A  B  C  D
#1 1  3  2  1 NA
#2 2  4  2 NA NA
#3 3  3  2 NA  1
#4 4 NA  2 NA NA
#5 5 NA NA  3  4

有关如何sum创建(原始函数)的更多信息,请在此处查看源代码


推荐阅读