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

标签 r data.table zoo

我正在尝试使用 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/

    相关文章:

    windows - 如何在 parse() 之后保留多字节字符

    r - 使用 data.table 的 R 中每个因子的频率

    r - 使用字符串访问 data.table 列

    r - 将 xts 对象的秒设置为 0

    r - 时间序列 - 按自定义时间段聚合

    r - ranger.forest 的组件含义

    r - 两个数据框中所有交集的表

    R 删除包含特定值的行

    r - 查找与值关联的子组并计算每个 ID 中的连续子组

    r - 使用锥形窗口计算运行平均值