替换 R 中的缺失值

2024-06-25

我必须通过 ID 将缺失值替换为最大值(值)。如何在 R 中做

ID Value
 1    NA
 5    15
 8    16
 6     8
 7    65
 8    NA
 5    25
 1    62
 6    14
 7    NA
 9    11
 8    12
 9    36
 1    26
 4    13

我首先使用调用来预先计算最大值aggregate(),并预先计算 data.frame 的哪些行具有 NA 值。然后您可以将 ID 匹配到聚合表中以提取相应的最大值。

maxes <- aggregate(Value~ID,df,max,na.rm=T);
nas <- which(is.na(df$Value));
df$Value[nas] <- maxes$Value[match(df$ID[nas],maxes$ID)];
df;
##    ID Value
## 1   1    62
## 2   5    15
## 3   8    16
## 4   6     8
## 5   7    65
## 6   8    16
## 7   5    25
## 8   1    62
## 9   6    14
## 10  7    65
## 11  9    11
## 12  8    12
## 13  9    36
## 14  1    26
## 15  4    13

替代方案,使用ave():

df$Value <- ave(df$Value,df$ID,FUN=function(x) { x[is.na(x)] <- max(x,na.rm=T); x; });
df;
##    ID Value
## 1   1    62
## 2   5    15
## 3   8    16
## 4   6     8
## 5   7    65
## 6   8    16
## 7   5    25
## 8   1    62
## 9   6    14
## 10  7    65
## 11  9    11
## 12  8    12
## 13  9    36
## 14  1    26
## 15  4    13

Data

df <- data.frame(ID=c(1L,5L,8L,6L,7L,8L,5L,1L,6L,7L,9L,8L,9L,1L,4L),Value=c(NA,15L,16L,8L,
65L,NA,25L,62L,14L,NA,11L,12L,36L,26L,13L));

标杆管理

Notes:

  • 我必须修改bgoldst2(), rafa(), and akrun()防止组中零个非 NA 的情况;否则,max(...,na.rm=T)回报-Inf这可能会扰乱后续操作。我对所有三名警卫使用了相同的算法。thierry() and bgoldst1()不必修改。
  • 大规模循环编写起来相当棘手,我不会尝试解释所有细节;如果有兴趣,请随时提出后续问题。基本上我运行了 12 个不同的基准测试,这些基准测试因组的数量和 NA 的频率而异。结果表res显示了两个参数、所有解决方案的平均运行时间以及微基准汇总算法选择的单位。

library(microbenchmark);
library(dplyr);
library(data.table);
library(zoo);

thierry <- function(df) df %>% group_by(ID) %>% mutate(Value = ifelse(is.na(Value), max(Value, na.rm = TRUE), Value));
bgoldst1 <- function(df) { maxes <- aggregate(Value~ID,df,max,na.rm=T); nas <- which(is.na(df$Value)); df$Value[nas] <- maxes$Value[match(df$ID[nas],maxes$ID)]; df; };
bgoldst2 <- function(df) { df$Value <- ave(df$Value,df$ID,FUN=function(x) { nas <- is.na(x); if (any(!nas) && any(nas)) x[nas] <- max(x,na.rm=T); x; }); df; };
rafa <- function(dt) dt[ , Value := { nas <- is.na(Value); if (any(!nas) && any(nas)) ifelse( nas, max(Value, na.rm=T), Value) else Value; }, by = ID];
akrun <- function(dt) dt[, Value := { nas <- is.na(Value); if (any(!nas) && any(nas)) na.aggregate(Value, FUN = max) else Value; }, ID];

## small scale (OP's sample input)
df <- data.frame(ID=c(1L,5L,8L,6L,7L,8L,5L,1L,6L,7L,9L,8L,9L,1L,4L),Value=c(NA,15L,16L,8L,65L,NA,25L,62L,14L,NA,11L,12L,36L,26L,13L));
dt <- as.data.table(df);

ex <- as.data.frame(thierry(copy(df)));
identical(ex,bgoldst1(copy(df)));
identical(ex,bgoldst2(copy(df)));
identical(ex,as.data.frame(rafa(copy(dt))));
identical(ex,as.data.frame(akrun(copy(dt))));

microbenchmark(thierry(copy(df)),bgoldst1(copy(df)),bgoldst2(copy(df)),rafa(copy(dt)),akrun(copy(dt)));
## Unit: microseconds
##                expr      min        lq      mean   median       uq      max neval
##   thierry(copy(df))  955.804  989.1610 1043.2847 1004.984 1044.542 2852.016   100
##  bgoldst1(copy(df))  953.238 1005.1985 1069.6281 1039.410 1075.760 2968.337   100
##  bgoldst2(copy(df))  160.798  181.9665  196.0281  192.872  207.412  246.329   100
##      rafa(copy(dt))  947.679 1006.6945 1056.9396 1033.637 1055.874 2943.105   100
##     akrun(copy(dt)) 1327.862 1384.5255 1496.1259 1415.530 1445.894 3969.899   100

## large scale, 3 group sizes crossed with 4 NA densities
NV <- 1e5L;
NIs <- c(10L,1e3L,3e4L);
probNAs <- c(1e-3,0.05,0.4,0.95);
res <- expand.grid(NI=NIs,probNA=probNAs);
system.time({
    for (ri in seq_len(nrow(res))) {

        NI <- res$NI[ri];
        probNA <- res$probNA[ri];

        df <- data.frame(ID=sample(seq_len(NI),NV,T),Value=sample(c(NA,1:99),NV,T,c(probNA,rep((1-probNA)/99,99L))));
        dt <- as.data.table(df);

        ex <- as.data.frame(thierry(copy(df)));
        if (!all(c(
            identical(ex,bgoldst1(copy(df))),
            identical(ex,bgoldst2(copy(df))),
            identical(ex,as.data.frame(rafa(copy(dt)))),
            identical(ex,as.data.frame(akrun(copy(dt))))
        ))) stop('non-identical failure.');

        bm <- summary(microbenchmark(thierry(copy(df)),bgoldst1(copy(df)),bgoldst2(copy(df)),rafa(copy(dt)),akrun(copy(dt)),times=5L));

        nms <- sub('\\(.*','',as.character(bm$expr));
        for (nm in nms) if (!nm%in%names(res)) res[[nm]] <- NA_real_;
        if (!'unit'%in%names(res)) res$unit <- NA_character_;

        res[ri,nms] <- bm$mean;
        res$unit[ri] <- attr(bm,'unit');

    }; ## end for
});
##    user  system elapsed
##   73.18    0.00   73.37
res;
##       NI probNA    thierry  bgoldst1   bgoldst2       rafa       akrun         unit
## 1     10  0.001   7.850589 138.77128  14.867427   7.071150    8.023874 milliseconds
## 2   1000  0.001  40.318311 177.26223   9.868853   6.389129   18.054122 milliseconds
## 3  30000  0.001 813.204627 619.16166 125.274735  57.301590   74.732023 milliseconds
## 4     10  0.050   9.387743 139.41686  15.032158   8.479837    6.933616 milliseconds
## 5   1000  0.050  43.223697 156.79871  23.377797  20.550586  145.632279 milliseconds
## 6  30000  0.050 822.338773 677.81813 129.268155 114.585475  656.468438 milliseconds
## 7     10  0.400  15.955374 110.20717   9.785802  11.832889   10.511871 milliseconds
## 8   1000  0.400  55.858348 115.93900  14.441228  22.525058  142.740834 milliseconds
## 9  30000  0.400 853.571520 521.19690 147.925864 208.278328 2518.672465 milliseconds
## 10    10  0.950   9.768268  43.98346   5.921021   9.895623    8.571868 milliseconds
## 11  1000  0.950  49.228024  63.72596  13.702929  22.152230  143.606916 milliseconds
## 12 30000  0.950 822.033257 103.91700 113.398739  86.240922  630.982913 milliseconds
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

替换 R 中的缺失值 的相关文章

  • 动态显示仪表板页面

    我有一个实用的闪亮应用程序 它使用shinydashboard包裹 新功能需要特定于用户的行为 例如 针对不同的用户名使用不同的数据集 因此我打算 显示登录表单 验证凭据并设置反应值LoggedIn to true如果成功的话 显示实际情况
  • 如何解决 R 估计中的整数溢出错误

    我正在尝试使用估计模型speedglm在 R 中 数据集很大 约 6988 万行和 38 列 行数和列数相乘得到约 27 亿 超出了整数限制 我无法提供数据 但以下示例重现了该问题 library speedglm large exampl
  • 用于检查和批量线性模型的数据表选项

    我想知道是否有data table用于从数据集中批量处理线性模型并首先进行检查的选项 我需要对每个唯一标识符运行一堆线性模型 但首先我需要进行检查 对于每个唯一的 id 和年份 我需要检查是否有至少 24 个月的先前每月数据 但不超过 60
  • 在 dfm 中查找非英语标记并将其删除

    在 dfm 中如何检测非英语单词并将其删除 dftest lt data frame id 1 3 text c Holla this is a spanish word English online here Bonjour commen
  • 双精度数据类型和数值数据类型之间的区别

    R编程中双精度数据类型和数值数据类型有什么区别 From stat ethz ch https stat ethz ch R manual R devel library base html double htm R 的浮点向量有两个名称
  • 从 R 中的 glm 中提取系数

    我进行了逻辑回归 结果如下 ssi logit single age coefficients coefficients Intercept age 3 425062382 0 009916508 我需要选取系数age 目前我使用以下代码
  • 使用 dplyr::filter 创建 R 函数问题

    我查看了其他答案 但找不到使下面的代码起作用的解决方案 基本上 我正在创建一个函数inner join两个数据框和filter基于函数中输入的列 问题是filter部分功能不起作用 但是 如果我将过滤器从函数中取出并附加它 它就会起作用my
  • 使用 R 绘图将目录添加到 PDF

    我正在 R 中创建大量绘图并将它们保存为 PDF 使用 grDevices pdf 有没有一种简单的方法可以在创建 PDF 时将 元数据 目录添加到 PDF 中 我并不是想添加一个单独的页面 而是添加一个 TOC 像 Preview app
  • 使用 dplyr::mutate 重新编码而不在函数中工作

    我正在尝试使用dplyr mutate across 重新编码 a 中的指定列tbl 单独使用它们效果很好 但我无法让它们在函数中工作 library dplyr library tidyr df1 lt tibble Q7 1 1 5 Q
  • 从 r 中的数据帧中删除每第 n 列

    我试图通过删除每第三列来减小数据框的大小 这是我的示例数据框 example data frame x c 1 2 3 4 y c 1 2 3 4 z c 1 2 3 4 w c 1 2 3 4 p c 1 2 3 4 q c 1 2 3
  • 使用 cmd 和 R 配置 databricks

    我正在尝试使用 databricks cli 并调用 databricks 配置 这就是我从 cmd 执行此操作的方法 somepath gt databricks configure token Databricks Host shoul
  • R 中的离散化

    有谁知道有一个包可以实现连续变量离散化的监督学习算法 dprep 包包含类似的功能 但该包已被弃用 有任何想法吗 感谢您的帮助 您仍然可以使用dprep包 但你必须从源代码安装它 我刚刚测试过 它运行良好 不过 您或许可以看看离散化 htt
  • 如何在闪亮的应用程序中初始化渲染项目的默认值

    介绍 In a shinyApp 我想用动态输入渲染输出 我的问题是 使用shinydashboard使用不同的选项卡 默认值来自 Input 仅当激活相应选项卡时才会呈现 想想输入和输出选项卡 当使用时我得到同样的行为switch声明in
  • 如何计算两个邮政编码之间的距离?

    我有一个美国邮政编码列表 我必须计算所有邮政编码点之间的距离 它是一个 6k 邮政编码长列表 每个实体都有邮政编码 城市 州 纬度 经度 面积和人口 所以 我必须计算所有点之间的距离 即 6000C2 组合 这是我的数据示例 我已经在 SA
  • 带有 selectInputs 的 DT 数据表在选择后重置回左侧

    我在 Shiny 应用程序的 DT 数据表的列中使用 selectInputs 感谢一些帮助here https stackoverflow com questions 74620665 vertically center selectin
  • 从谷歌街道地址中提取城市和州信息

    我有一个数据集 其中包含不同点位置的纬度 经度信息 我想知道与每个点关联的城市和州 按照此example https stackoverflow com questions 22911642 applying revgeocode to a
  • 使用同一变量的多个子集创建新数据框

    我想创建一个新的数据框 其中的列是由不同变量分割的同一变量的子集 例如 我想创建一个新的变量子集 b 其中列由不同变量 year 的子集分割 set seed 88 df lt data frame year rep 1996 1998 3
  • 通过环境.yml 文件使用 conda 安装 R 包

    通常我会创建 conda 环境 例如 conda env create f environment yml conda activate env name 通常我使用 Python 工作 典型的environment yml简单的文件可能看
  • 使用 R 中的剪切函数对缺失值进行 NA 级别[重复]

    这个问题在这里已经有答案了 R 中的 cut 函数省略了 NA 但我想要一个缺失值的级别 这是我的 MWE set seed 12345 Y lt c rnorm n 50 mean 500 sd 1 NA Y1 lt cut log Y
  • 在 R 中提取栅格的最快方法(提高我的可重现代码的时间)

    我想知道我是否已最大化提取栅格中某个点周围缓冲区域平均值的速度 本地的性能可以进一步提高吗 I use parallel mclapply已经 我知道我可以通过在集群上设置和运行它来获得进一步的收益 使用集群或获得更多的CPU不是我正在寻找

随机推荐

  • 如何更改 Fabric 中的时区? [复制]

    这个问题在这里已经有答案了 我可以更改 Fabric 中的时区吗 Fabric 获得了 UTC 但我们位于其他时区 所以当我们查看Fabric中的数据时 我们会一头雾水 UTC 时区 https i stack imgur com C4s7
  • CSS 3 多列中的 jQuery offset() 方法

    这里遇到了一些严重的问题 我正在开发一个 iOS 应用程序 它必须使用 CSS 多列模块在 UIWebView 中的多个列中显示 html 页面 我将以下 CSS 规则添加到页面中以完成多列 padding 0px height 850 0
  • 如何从 VDI 中提取文件

    我在我的电脑上使用 VirtualBox WIN 7 我设法查看了我的一些文件 VDI file 我如何打开或查看我的内容 vdi文件并从那里检索文件 我有一个损坏的 VDI 文件 根据我使用过的无数 VDI 查看器程序 出现一些神秘错误
  • 如何获得 lmer 对象的置信区间?

    我正在尝试获取混合模型预测的置信区间 预测函数不输出任何置信区间 很少有StackOverflow答案建议使用merTools包中的predictInterval函数来获取间隔 但是这两个函数的预测估计之间存在差异 我试图在下图中进行比较
  • 在jquery mobile中动态添加
  • 我正在尝试将列表项添加到 jquery mobile 中的无序列表 但格式似乎未正确创建 ul li Title Divider li li a href test html List item 1 a li ul
  • 矩阵和向量每列之间的 numpy 协方差

    基于这个帖子 https stackoverflow com questions 15036205 numpy covariance matrix 我可以使用两个向量之间的协方差np cov x y rowvar 0 我有一个矩阵 MxN
  • 如何向量化 pandas 数据框中的比较?

    我有数据框的一部分df像这样 nr Time Event 70 8 70 0 70 0 74 52 74 12 74 0 我想将事件分配给最后一列 默认情况下 第一个条目为 1 If Time i lt 7 and nr i nr i 1
  • 大量使用 AJAX 的页面也能被搜索引擎友好吗?

    我想我的意思是 如果我创建一个使用 AJAX 加载一些我也希望搜索引擎找到的内容的网站 如果我使页面工作无 javascript 例如 当 javascript 不存在时 链接去site com c somecontent而不是调用函数 c
  • 为什么我的 Facebook 会话在我注销后仍然有效?

    我的注销代码 if fb isSessionValid masyncfb logout this new RequestListener Override public void onComplete String response Obj
  • 网络关闭时在网络文件夹上使用 Directory.Exists

    我公司的代码库包含以下 C 行 bool pathExists Directory Exists path 在运行时 字符串path恰好是公司内联网上文件夹的地址 类似 company companyFolder 当我的 Windows 计
  • 具有引用限制的 API 密钥不能与此 API 一起使用

    当我访问 API 时出现以下错误响应 error message API keys with referer restrictions cannot be used with this API results status REQUEST
  • 使用 O(1) 辅助空间迭代二叉树

    是否可以在 O 1 辅助空间中迭代二叉树 不使用堆栈 队列等 或者这已被证明是不可能的 如果可以的话 怎样才能做到呢 编辑 我得到的关于如果有指向父节点的指针就可能实现这一点的响应很有趣 我不知道可以做到这一点 但取决于您如何看待它 这可以
  • Qt 要包含哪些标头?

    使用 Qt 使用 C 进行编程时 我应该包含哪些内容 仅包含 2 个 include
  • 如何在c中找到两个时间之间的差异?

    我的第一次是中午 12 10 20 第二次是同一天的上午 7 10 20 我怎样才能找到它们之间的差异 我的想法是将所有时间转换为秒 然后再次找到差异转换为时间 这是其他什么好的方法吗 你想要的difftime http linux die
  • 在较小的设备中更改 DataTables (jQuery+Bootstrap4) 的“pagingType”选项

    我正在与数据表 https datatables net它启用了分页并显示带有页码 1 2 3 4 5 10 的 下一个 上一个 按钮 我正在尝试使用以下方法将其更改为仅在较小设备 小于 768px 中的 下一个 上一个 分页类型 http
  • 休眠查询计数

    有什么方法可以统计 Hibernate 在事务或线程中内部完成的查询数量吗 我研究了 Hibernate 拦截器 但不清楚应该重写哪些 API 来增加计数器 我的目标是建立一个警报 当某个请求的查询计数超过某个阈值时通知我 以便我可以根据需
  • 在 Helidon 微配置文件应用程序中访问 Kubernetes 秘密

    请问我们是否有任何访问 kubernetes OKE 集群中机密的示例 例如 某些密码存储为秘密 并且该密码需要分配给属性文件中的某些参数 例如 oracle ucp jdbc PoolDataSource test ds password
  • 如何在AD中列出所有计算机以及它们上次登录的时间?

    我正在尝试检索计算机名称列表以及它们上次从 Active Directory 登录的日期 并将它们返回到数据表中 获取名称很容易 但是当我尝试添加 lastLogon 或 lastLogonTimestamp 如下所示 时 我获得的 las
  • 在 switch 语句中声明和初始化的变量

    为什么这个程序不输出20 include
  • 替换 R 中的缺失值

    我必须通过 ID 将缺失值替换为最大值 值 如何在 R 中做 ID Value 1 NA 5 15 8 16 6 8 7 65 8 NA 5 25 1 62 6 14 7 NA 9 11 8 12 9 36 1 26 4 13 我首先使用调