按组有条件 NA 填充

2023-11-21

edit
这个问题最初是问的data.table。任何包的解决方案都会很有趣。


我对一个更普遍的问题的特定变体有点困惑。我有与 data.table 一起使用的面板数据,我想使用 data.table 的分组功能来填充一些缺失的值。不幸的是它们不是数字,所以我不能简单地插值,但它们应该只根据条件填写。是否可以在 data.tables 中执行一种条件 na.locf ?

本质上,我只想在 NA 之后的下一个观察是之前的观察时填写 NA,尽管更普遍的问题是如何有条件地填写 NA。

例如,在以下数据中,我想按每个 id 组填写 Associatedid 变量。所以id==1 , year==2003将填写为ABC123因为它是 NA 之前和之后的值,但对于相同的 id 不是 2000。id== 2不会改变,因为下一个值与 NA 之前的值不同。id==3将填补 2003 年和 2004 年的空缺。

mydf <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), year = c(2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L), associatedid = structure(c(NA, 1L, 1L, NA, 1L, 1L, NA, 1L, 1L, NA, 2L, 2L, NA, 1L, 1L, NA, NA, 1L), .Label = c("ABC123", "DEF456"), class = "factor")), class = "data.frame", row.names = c(NA, -18L))

mydf
#>    id year associatedid
#> 1   1 2000         <NA>
#> 2   1 2001       ABC123
#> 3   1 2002       ABC123
#> 4   1 2003         <NA>
#> 5   1 2004       ABC123
#> 6   1 2005       ABC123
#> 7   2 2000         <NA>
#> 8   2 2001       ABC123
#> 9   2 2002       ABC123
#> 10  2 2003         <NA>
#> 11  2 2004       DEF456
#> 12  2 2005       DEF456
#> 13  3 2000         <NA>
#> 14  3 2001       ABC123
#> 15  3 2002       ABC123
#> 16  3 2003         <NA>
#> 17  3 2004         <NA>
#> 18  3 2005       ABC123

dt = data.table(mydf, key = c("id"))

期望的输出

#>    id year associatedid
#> 1   1 2000         <NA>
#> 2   1 2001       ABC123
#> 3   1 2002       ABC123
#> 4   1 2003       ABC123
#> 5   1 2004       ABC123
#> 6   1 2005       ABC123
#> 7   2 2000         <NA>
#> 8   2 2001       ABC123
#> 9   2 2002       ABC123
#> 10  2 2003         <NA>
#> 11  2 2004       DEF456
#> 12  2 2005       DEF456
#> 13  3 2000         <NA>
#> 14  3 2001       ABC123
#> 15  3 2002       ABC123
#> 16  3 2003       ABC123
#> 17  3 2004       ABC123
#> 18  3 2005       ABC123

这就是编写修改后的 na.locf 函数的全部内容。之后,您可以像任何其他函数一样将其插入 data.table 中。

new.locf <- function(x){
  # might want to think about the end of this loop
  # this works here but you might need to add another case
  # if there are NA's as the last value.
  #
  # anyway, loop through observations in a vector, x.
  for(i in 2:(length(x)-1)){
    nextval = i
    # find the next, non-NA value
    # again, not tested but might break if there isn't one?
    while(nextval <= length(x)-1 & is.na(x[nextval])){
      nextval = nextval + 1
    }
    # if the current value is not NA, great!
    if(!is.na(x[i])){
      x[i] <- x[i]
    }else{
      # if the current value is NA, and the last value is a value
      # (should given the nature of this loop), and
      # the next value, as calculated above, is the same as the last
      # value, then give us that value. 
      if(is.na(x[i]) & !is.na(x[i-1]) & x[i-1] == x[nextval]){
        x[i] <- x[nextval]
      }else{
        # finally, return NA if neither of these conditions hold
        x[i] <- NA
      }
    }
  }
  # return the new vector
  return(x) 
}

一旦我们有了这个函数,我们就可以像往常一样使用 data.table :

dt2 <- dt[,list(year = year,
                # when I read your data in, associatedid read as factor
                associatedid = new.locf(as.character(associatedid))
                ),
          by = "id"
          ]

这将返回:

> dt2
    id year associatedid
 1:  1 2000           NA
 2:  1 2001       ABC123
 3:  1 2002       ABC123
 4:  1 2003       ABC123
 5:  1 2004       ABC123
 6:  1 2005       ABC123
 7:  2 2000           NA
 8:  2 2001       ABC123
 9:  2 2002       ABC123
10:  2 2003           NA
11:  2 2004       DEF456
12:  2 2005       DEF456
13:  3 2000           NA
14:  3 2001       ABC123
15:  3 2002       ABC123
16:  3 2003       ABC123
17:  3 2004       ABC123
18:  3 2005       ABC123

据我所知,这就是您正在寻找的东西。

我在 new.locf 定义中提供了一些对冲,因此您可能仍然需要一些思考,但这应该可以帮助您开始。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按组有条件 NA 填充 的相关文章

  • 如何对同一列上的数据帧列表中的所有数据帧进行排序?

    我有一个数据框列表dataframes list 举个例子 我把dput dataframes list 在底部 我想对列列表中的所有数据框进行排序enrichment 我可以对一个数据框进行排序 first dataframe lt da
  • 在 R 中创建一个运行计数变量?

    我有一个足球比赛结果的数据集 我希望通过创建一组类似于世界足球 Elo 公式的运行评级来学习 R 我遇到了麻烦 在 Excel 中看似简单的事情在 R 中并不完全直观 例如 4270 个观察中的前 15 个具有必要的变量 date t 1
  • 如何删除箱线图上的刻度线

    我试图从箱线图中删除 x 轴刻度线 但保留与刻度线关联的标签 这在基础 R 中可能吗 colors lt c lightskyblue3 gray78 gold1 wheat1 boxplot avgscore module data mi
  • 正则表达式字符串中第一个和最后一个非点的位置

    我希望找到字符串的第一个和最后一个非点元素的位置 理想情况下我想这样做regex在基地R 我已经写过R解决问题的代码 不过 我对一个感兴趣regex解决方案 感谢您的任何建议 这是一个示例数据集和R代码以获得所需的结果 此代码拆分字符串并使
  • R - Plm 和 lm - 固定效应

    我有一个平衡面板数据集 df 本质上由三个变量组成 A B and Y 对于一堆独特识别的区域来说 它会随着时间的推移而变化 我想运行一个回归 其中包括区域 下面等式中的区域 和时间 年份 固定效应 如果我没记错的话 我可以通过不同的方式来
  • 使用 purrr 迭代替换数据帧列中的字符串

    我想用purrr使用以下命令在数据框列上迭代运行多个字符串替换gsub 功能 这是示例数据框 df lt data frame Year 2019 Text c rep a aa 5 rep a bb 3 rep a cc 2 gt df
  • 如何计算R中移动窗口内的平均斜率

    我的数据集包含2个变量y 和 t 05s y 每 05 秒测量一次 我正在尝试计算移动中的平均坡度20秒窗口 即计算第一个 20 秒斜率值后 窗口向前移动一个时间单位 05 秒 并计算下一个 20 秒窗口 在以下位置生成连续 20 秒斜率值
  • 多功能测试仪替代 system.time

    我已经看到 我认为是这样 使用了类似于 system time 的函数 它可以同时评估多个函数的时间并输出一个输出 我不记得它是什么 并且用我正在使用的术语进行互联网搜索并没有得到我想要的响应 有人知道我正在谈论的功能的名称 位置吗 你想要
  • 如何使用 R 计算成为列表中中位数的概率?

    假设我有以下数据集 其中显示了假设实验的每个状态的三个观察结果的列表 state lt c Iowa Minnesota Illinois outcome lt list c 5 11 11 c 3 12 8 c 9 14 2 dat lt
  • 通过间接引用列来修改数据框中的某些值

    我正在整理一些数据 我们将失败的数据分类到垃圾箱中 并按批次计算每个分类箱的有限产量 我有一个描述排序箱的元表 这些行按升序测试顺序排列 一些排序标签带有非语法名称 sort tbl lt tibble tribble weight lab
  • 时间戳半小时窗口内字段的平均值

    我的数据框有列名Timestamp es看起来像 Timestamp es 2015 04 01 09 07 42 31 2015 04 01 09 08 01 29 5 2015 04 01 09 15 03 18 5 2015 04 0
  • API 请求和curl::curl_fetch_memory(url, handle = handle) 中的错误:SSL 证书问题:证书已过期

    几天前 我运行了代码几个月 没有任何问题 GET url myurl query 今天我遇到一个错误 Error in curl curl fetch memory url handle handle SSL certificate pro
  • Purrr::map_df() 删除 NULL 行

    使用时purrr map df 我偶尔会传递一个数据框列表 其中一些项目是NULL 当我做 map df 返回行数少于原始列表的数据框 我想发生的事情是这样的map df calls dplyr bind rows 它忽略了NULL价值观
  • 以引用透明的方式从函数的省略号参数中提取符号

    事情又发生了 我正要按下发布答案按钮的问题被删除了 我正在寻找一种方法来从函数的省略号参数中提取绑定到符号的对象的值以及符号 也就是说 我试图以引用透明的方式从省略号中提取符号 我尝试过使用替代品和lazy dots 但没有成功 funct
  • 将每列的值乘以 R 中另一个 data.frame 中的权重

    我有两个data frames df and weights 代码如下 df看起来像这样 id a b d EE f 1 this 0 23421153 0 02324956 0 5457353 0 73068586 0 5642554 2
  • r 中训练和测试数据的最小最大缩放/归一化

    我正在创建一个函数 它将训练集和测试集作为其参数 最小 最大缩放 标准化并返回训练集并使用这些same最小值和最小 最大范围的值 标准化并返回测试集 到目前为止 这是我想出的功能 min max scaling lt function tr
  • 基于时间窗口的不规则时间序列的优化滚动函数

    有没有办法使用 rollapply 来自zoo包或类似的东西 优化功能 rollmean rollmedian等 使用基于时间的窗口计算滚动函数 而不是基于大量观察的函数 我想要的很简单 对于不规则时间序列中的每个元素 我想计算一个具有 N
  • 在 r 中的 group_by 之后建模后取消列表列的嵌套

    我想对所有组进行线性回归group by 将模型系数保存在列表列中 然后使用 unnest 扩展列表列 这里我用的是mtcars以数据集为例 注 我想用do here becausebroom tidy 不适用于所有型号 mtcars gt
  • 旋转 Markdown 的表格 pdf 输出

    我想将 pdf 上的表格输出旋转 90 度 我正在使用 Markdown 生成报告并kable循环显示表格 如果可以的话我想继续使用kable因为还有很多其他依赖于它的东西我没有包含在这个 MWE 中 这是一个简单的例子 使用iris数据集
  • 如何仅删除单括号并保留配对的括号

    你好 我亲爱的老师 R 用户朋友们 我最近开始认真学习正则表达式 最近我遇到了一种情况 我们只想保留配对括号 并省略未配对的 这是我的样本数据 structure list t1 c Book Pg 1 Website Online Jou

随机推荐

  • 在 Javascript 中,从不在数组中的对象中删除键

    假设我有一个包含许多键的对象列表 并且我只想保留其中的某些键 我就是这样做的 SO 上其他好的解决方案的问题是 如果键中不存在键以保留它 它仍然会添加一个键 值未定义 let data a 1 b 2 c 3 a 1 c 3 d 4 con
  • 如何在 google chrome 上删除 iframe 的水平滚动条

    我想要启用垂直滚动并关闭水平滚动 using 滚动 否 不是我想要的 因为我仍然想要垂直滚动 我尝试过将其添加到CSS中 myiframe overflow x hidden overflow y auto 但它仍然显示仅适用于 Chrom
  • React Apollo 从状态动态创建查询

    这是一个模型情况 我的数据库中有一些字段 比如颜色 大小 高度 我可以获取这些字段并将其显示给可以选择这些字段的用户 然后将它们设置为组件状态 我想要实现的是动态创建GQL查询 不是查询变量 来自存储在状态中的这些字段 Example im
  • 如何获取通知区域图标列表?

    我正在尝试获取代码以列出通知区域中时间左侧可见的所有图标 我一直在尝试EnumDesktopWindows and GetWindowLong 没有找到任何方法来挑选系统托盘图标 谢谢 使用可访问性接口枚举子级User Promoted N
  • C 地址运算符中的函数指针“不必要”

    在 C 中使用 qsort 我们传入一个比较函数 例如 int cmp const void const void qsort 的原型期望int const void const void 所以我们打电话 qsort cmp 但调用以下方法
  • CodeIgniter 列表字段

    我正在使用 CodeIgniter 2 1 3 我的功能有问题list fields 它应该返回 MySQL 结果的字段数组 所以我下面的代码应该列出 MySQL 结果的所有字段 query this gt db gt query SELE
  • Android OpenGLES 2 从触摸坐标拾取光线,非投影计算略有关闭

    我正在尝试通过相交光线测试来实现基于触摸坐标的对象拾取 我无法找到有关将触摸坐标转换为世界上使用的坐标系以构造这条射线的信息 到目前为止 我的理解是应用于场景中每个顶点的矩阵是 projectionMatrix viewMatrix mod
  • Swift 字典错误?

    所以我在 Swift 中开始了一个项目 我遇到了这个问题 这段代码有效 var dictionary a valueOfA b valueOfB c valueOfC println dictionary dictionary c newV
  • Spring组件扫描的性能取决于扫描包的大小吗?

    在我们的应用程序中 我们遇到了组件扫描的性能问题 它非常慢 并且其性能不依赖于扫描包中的类数量 我们的 spring 配置文件中的每一行都是这样的
  • 多个小查询与单个长查询。哪一种效率更高?

    以下哪一种方法更有效 单个较长查询 SELECT COUNT AS num FROM SELECT users UID cnumber FROM users JOIN identity ON users UID identity UID W
  • 与多个 Chrome Docker 容器的 Websocket 通信

    我有一个 Chrome 容器 使用这个 Dockerfile 根据应用程序容器的请求呈现页面 基本流程是 应用程序向 Chrome 发送 http 请求 并作为响应接收要使用的 websocket url 例如ws chrome examp
  • 标签位置应固定在右侧并向左增长

    即使标签长度不同 如何将标签设置为右侧对齐 我有一组标签 它们彼此相邻 也彼此下方 现在的问题是它们总是从标签行的左侧对齐 但我需要它们在右侧对齐 因为它们显示其他行的总和 只是为了验证我不是在谈论文本对齐 我正在寻找一种对齐标签的解决方案
  • 单击取消按钮 showInputDialog

    我有一个关于按输入对话框的取消按钮的问题 我以前曾问过类似的问题 所以如果我似乎重复了自己的话 我深表歉意 我遇到的主要问题是 无论我按下取消键 我的代码都会执行 并且即使我不添加任何输入 也会建立套接字连接 为什么会发生这种情况以及如何避
  • Xcode 5 和phonegap:为设备构建链接器错误,但不为模拟器构建链接器错误

    我们的phonegap应用程序对于iPhone模拟器构建得很好 但在iPhone上构建应用程序时会生成链接器错误 唯一改变的是安装 testflight 和测试应用程序 我们已经删除了 testflight 和测试应用程序 但链接器错误仍然
  • Apache Shiro 和 SSO

    Apache Shiro 是一个 Java 安全框架 支持 SSO 我有多个子域 每个子域都有单独的应用程序运行 我如何使用 Apache Shiro Web 过滤器 或任何其他过滤器 来提供单点登录 在使用 Apache Shiro 之前
  • 在 Oracle SQL 中删除表

    每当我尝试删除表或创建表时 它都会显示以下错误 DROP TABLE SUBURB DROP TABLE STOCKITEM DROP TABLE MANUFACTURER DROP TABLE WAREHOUSE DROP TABLE C
  • 重写规则以仅检测数字

    我正在尝试创建一个重写规则 该规则将仅检测数字并相应地转发它们 我希望如果出现除数字以外的任何内容 则忽略重写规则 index php OK OK 42365 重写为view php id 42365 到目前为止我所拥有的 RewriteE
  • 我正在做正确的事情将分贝从 -120 - 0 转换为 0 - 120

    我想测量周围的音量 不太确定我做的是否正确 我想创建一个范围从 0 安静 到 120 非常吵闹 的 VU 表 我得到了峰值功率和平均功率 但在正常安静环境中非常高 请给我一些指示 void viewDidLoad super viewDid
  • 如何最好地消毒 ruby​​ on Rails 中的字段

    我目前有一个控制器从前端的 TinyMCE 捕获一些 html 如果我修补萤火虫 就可以提交脚本标签并将警报消息等注入到屏幕上 编辑 目前我正在使用清理助手在模型中修复此问题 require action view class NotesC
  • 按组有条件 NA 填充

    edit这个问题最初是问的data table 任何包的解决方案都会很有趣 我对一个更普遍的问题的特定变体有点困惑 我有与 data table 一起使用的面板数据 我想使用 data table 的分组功能来填充一些缺失的值 不幸的是它们