【问题标题】:Replace duplicated values in consecutive runs with blank用空白替换连续运行中的重复值
【发布时间】:2020-09-09 03:28:37
【问题描述】:

首先,一些数据:

library(data.table)

# 1. Input table
df_input <- data.table(
  x = c("x1", "x1", "x1", "x2", "x2"),
  y = c("y1", "y1", "y2", "y1", "y1"),
  z = c(1:5))

在每一列中,我只想保留每次连续值运行中的第一个值。例如。查看y 列,它有三个不同的运行:(1) 两个y1,(2) 一个y2,和(3) 第二个运行y1。在每次这样的运行中,重复值应替换为""。

#     x  y z
# 1: x1 y1 1   # 1st value in run of y1: keep
# 2: x1 y1 2   # 2nd value in run: replace
# 3: x1 y2 3   # 1st value in run: keep
# 4: x2 y1 4   # 1st value in 2nd run of y1: keep
# 5: x2 y1 5   # 2nd value: replace

因此,所需的输出表:

df_output <- data.table(
  x = c("x1", "", "",  "x2", ""),
  y = c("y1", "", "y2", "y1", ""),
  z = c(1:5))

#     x  y z
# 1: x1 y1 1
# 2:       2
# 3:    y2 3
# 4: x2 y1 4
# 5:       5

如何使用 dplyr 或 data.table 包获取“输出”表?

谢谢

【问题讨论】:

    标签: r dplyr data.table grouping


    【解决方案1】:

    我们可以使用set 和data.table

    library(data.table)
    for(j in names(df_input)) 
      set(df_input, i = which(duplicated(rleid(df_input[[j]]))), j = j, value = '')
    
    df_input
    #    x  y z
    #1: x1 y1 1
    #2:       2
    #3:    y2 3
    #4: x2 y1 4
    #5:       5
    

    【讨论】:

    • 我认为rleid 不是必需的
    【解决方案2】:

    我们可以使用rleid 和duplicated 到replace 连续重复值和空值('')。

    library(data.table)
    df_input[, lapply(.SD, function(x) replace(x, duplicated(rleid(x)), ''))]
    
    
    #    x  y z
    #1: x1 y1 1
    #2:       2
    #3:    y2 3
    #4: x2 y1 4
    #5:       5
    

    在dplyr 中使用它:

    library(dplyr)
    df_input %>% mutate_all(~replace(., duplicated(rleid(.)), ''))
    

    【讨论】:

      猜你喜欢
      • 2022-12-17
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多