gpt4 book ai didi

r - na.trim 在特定列上使用 data.table

转载 作者:行者123 更新时间:2023-12-01 07:35:42 24 4
gpt4 key购买 nike

我正在尝试使用 na.trim来自包裹 zoodata.table 的单列上目的。这是我的数据的样子:

DT <- data.table(id=c(rep("a",3),rep("b",3)),
col1=c(NA,1,2,NA,3,NA),col2=c(NA,NA,5,NA,NA,NA))
id col1 col2
1: a NA NA
2: a 1 NA
3: a 2 5
4: b NA NA
5: b 3 NA
6: b NA NA

我想用 删除行领先 NA 使用 na.trim并按 id 分组。这是我期待的结果:
   id col1 col2
1: a 1 NA
2: a 2 5
3: b 3 NA
4: b NA NA

这是我迄今为止尝试过的。这会删除前导 NA,但会删除 col2:
DT[,na.trim(col1),by=id]
id V1
1: a 1
2: a 2
3: b 3

这也不起作用:
DT[,.SD[na.trim(col1)],by=id]
id col1 col2
1: a NA NA
2: a 1 NA
3: b NA NA

最佳答案

不使用 zoo 的可能解决方案-包裹:

DT[DT[, .I[!!cumsum(!is.na(col1))], by = id]$V1]

你得到:
   id col1 col2
1: a 1 NA
2: a 2 5
3: b 3 NA
4: b NA NA

这是做什么的:
  • DT[, .I[!!cumsum(!is.na(col1))], id]$V1您创建一个要保留的行号向量。通过使用 !!cumsum(!is.na(col1))你确保只有 col1 的前导缺失值被省略。
  • 接下来,您使用该向量对 data.table 进行子集化。
  • !!cumsum(!is.na(col1))cumsum(!is.na(col1))!=0 相同.使用 !!将所有大于零的数字转换为 TRUE和所有零到 FALSE .
  • .I不一定需要,您也可以使用:DT[DT[, !!cumsum(!is.na(col1)), by = id]$V1]它使用逻辑向量对 data.table 进行子集化。


  • 两种选择 cummax @lmo 来自评论:
    # alternative 1:
    DT[DT[, !!(cummax(!is.na(col1))), by = id]$V1]

    # alternative 2:
    DT[as.logical(DT[, cummax(!is.na(col1)), by = id]$V1)]

    @jogo 的另一种选择:
    DT[, .SD[!!cumsum(!is.na(col1))], by = id]

    @Frank 的另一种选择:
    DT[, .SD[ rleid(col1) > 1L | !is.na(col1) ], by = id]

    关于r - na.trim 在特定列上使用 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44025738/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com