我有一个如下所示的数据表:

library(data.table)
cols <- c("A", "B", "C")
dt <- data.table(A = c(NA,10,20,15),
                 B = c(30,10,5,15),
                 C = c(40,10,NA,15),
                 TOTAL = c(75,30,30,45))
    A  B  C TOTAL
1: NA 30 40    75
2: 10 10 10    30
3: 20  5 NA    30
4: 15 15 15    45

我想 Select 所有行,其中ABC只缺少一个值,而TOTAL的值可用.所以在这种情况下,这将是行号1和3.为了保持它更一般,我想使用字符向量cols.

我试着做到了以下几点:

dt[!is.na(TOTAL), rowSums(is.na(.SD)) == 1, .SDcols = cols]

但理想情况下,我希望在中设置行的子集,如下所示:

    A  B  C TOTAL
1: NA 30 40    75
2: 20  5 NA    30

然后将j中的Nas计算为总减go 可用列:

    A  B  C TOTAL
1:  5 30 40    75
2: 20  5  5    30

有谁有办法实现这一点吗?

推荐答案

首先计算TOTAL与每行之和之间的差值.然后,在那些只有一个NA的行中,将NA设置为该值.

cols <- c("A", "B", "C")
dt[,
    diff := TOTAL - rowSums(.SD, na.rm = TRUE),
    .SDcols = cols
][dt[!is.na(TOTAL), rowSums(is.na(.SD)) == 1, .SDcols = cols]][,
    (cols) := lapply(.SD, \(x) fifelse(is.na(x), diff, x)),
    .SDcols = cols
][, diff := NULL][]

#        A     B     C TOTAL
#    <num> <num> <num> <num>
# 1:     5    30    40    75
# 2:    20     5     5    30

针对 comments 中的问题进行更新

如果您想要恢复完整的数据表,请只为有一个NA的那些值创建diff列,并且只替换diff不是NA的行中的值.

dt[dt[!is.na(TOTAL), rowSums(is.na(.SD)) == 1, .SDcols = cols],
    diff := TOTAL - rowSums(.SD, na.rm = TRUE),
    .SDcols = cols
][!is.na(diff),
    (cols) := lapply(.SD, \(x) fifelse(is.na(x), diff, x)),
    .SDcols = cols
][, diff := NULL][]

R相关问答推荐

为什么predicate.lm给出的是一个长度与我解析的数据集不同的载体?

使用%in%时如何应用多个条件?

使用列表列作为case_when LHS的输入

在图内移动y轴上的标签

有没有方法将paste 0功能与列表结合起来?

如何判断某列中由某些行组成的百分比

工作流程_set带有Dplyrr风格的 Select 器,用于 Select 结果和预测因子R

将复杂的组合列表转换为数据框架

基于不同组的列的相关性

更改编号列表的 colored颜色

获取一个数据库框架的摘要,该数据库框架将包含一列数据库框架,

如何使用按钮切换轨迹?

我不能在docker中加载sf

如何直接从R中的风险分数计算c指数?

移除仪表板Quarto中顶盖和车身之间的白色区域

使用R闪光显示所有数据点作为默认设置

R Read.table函数无法对制表符分隔的数据正常工作

仅 Select 超过9行的CSV文件

正在导出默认的RStudio主题,还是设置括号 colored颜色 ?

网络抓取新闻标题和时间