r - 如何使用 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 值?
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)
提前致谢。
解决方案
在第一个示例中,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
创建(原始函数)的更多信息,请在此处查看源代码
推荐阅读
- python - 从字符串中间剥离字符
- azure - Azure devops 服务连接和中央管道
- asp.net-mvc - ThreeJS / GLTFLoader 以 404 响应我的 gltf 对象
- android - Android 项目导出到 Android Studio 时出现 Unity Gradle 错误
- javascript - 如何获取此 JSON 数组中的最后一个对象?
- java - Docker - Mac 上的“端口不可用”问题
- python - 使用 python (ctypes) 调用 C 函数时出现问题?
- django - 如何使用异步 Django RESTAPI 调用同时运行 docker 命令
- git - 从 Visual Studio Code (1.62.2) 推送到 GitHub 时出现“致命:身份验证失败”
- amazon-web-services - 将缺失的数据字段提取到 SageMaker Feature Store 的功能组中