r - 展开数据表,添加新行并按组替换 NA 值
问题描述
我正在尝试基于列(在下面的示例中Month
)扩展数据表并按组()填充空值Group
。举个例子dt
;
set.seed(0)
dt<-data.table(ID=c(1:10),Month=sample(1:10,replace = F),Group=c("A","B","C","A","B","C","A","B",'A','A'))
dt[1:4,":="(Income=rnorm(4),Tax=rnorm(4),Birth=sample(seq(as.POSIXct('2000/01/01'), as.POSIXct('2002/05/01'), by="day"), 4))]
我想扩展该表,以便每Group
行有 10 行,这样每行的列值从 1 到 10。应根据现有行填充Month
剩余的列 ( Income
, Tax
, )。Birth
NA 应该采用最近的“月份”的值。因此,对于Group
A,数据表应该有 10 行,如下所示(即,最终数据表的每组总共应该有 10 行):
dt_desired<-data.table(
ID=rep(1:10),
Group=rep("A",10),
Income=c(rep(dt[Group=='A'&Month==1]$Income,8),rep(dt[Group=='A'&Month==9]$Income,2)),
Tax=c(rep(dt[Group=='A'&Month==1]$Tax,8),rep(dt[Group=='A'&Month==9]$Tax,2)),
Birth=c(rep(dt[Group=='A'&Month==1]$Birth,8),rep(dt[Group=='A'&Month==9]$Birth,2))
)
解决方案
据我所知,data.table::nafill()
无法处理非数字列(还没有?),所以我不得不zoo:na.locf()
改用..
library( data.table )
#first, create CJ, then perform update join
ans <- CJ( Group = dt$Group, Month = dt$Month, unique = TRUE )[ dt,
`:=`( Income = i.Income, Tax = i.Tax, Birth = i.Birth ),
on = .( Group, Month ) ]
#columns to fill NA's
cols = names(ans)[-(1:2)]
#for locf
ans[, (cols) := lapply( .SD, zoo::na.locf, na.rm = FALSE ), by = Group, .SDcols = cols]
#for nocb
ans[, (cols) := lapply( .SD, zoo::na.locf, na.rm = FALSE, fromLast = TRUE ), by = Group, .SDcols = cols][]
推荐阅读
- octave - 是否可以从旧式类派生 classdef 类?
- next.js - 关于静态/混合和 SSR 构建的一些 NextJS 问题
- antlr - 修改 ctx.removeLastChild/ctx.addChild 后,有没有办法从 antlr4ts 解析树中取回源代码?
- javascript - 在选择列表中的选定项目旁边添加输入文本
- c# - 限制 .net core 中的并发请求
- apache-spark-sql - 如何从以下架构中选择列“?
- c++ - 为什么向量化在这个 for 循环中没有好处?
- c++ - VS 2019(Visual Studio)Linux makefile 项目 - 从 Windows 编译时“没有这样的文件或目录”
- regex - 字符串的正则表达式,可以包含数字、字母或两者的组合。不要包含符号或特殊字符
- kubernetes - 谁能告诉我在执行 kubeadm upgrade apply 时如何避免升级 CoreDns?