【问题标题】:Replace nth consecutive occurrence of a value替换第 n 个连续出现的值
【发布时间】:2018-04-02 13:47:02
【问题描述】:

我想替换我的数据框中连续第 n 次出现的特定代码。这应该是一项相对容易的任务,但我想不出解决方案。

给定一个数据框

df <- data.frame(Values = c(1,4,5,6,3,3,2),
                 Code = c(1,1,2,2,2,1,1))

我想要一个结果

df_result <- data.frame(Values = c(1,4,5,6,3,3,2),
                        Code = c(1,0,2,2,2,1,0))

数据框是按时间排序的,因此我需要在替换值后保持相同的顺序。我想nth()duplicate() 函数在这里可能很有用,但我不确定如何使用它们。我缺少的是一个计算给定值连续出现次数的函数。一旦我有了它,我就可以用它来替换第 n 次出现。 This question 有一些想法,我探索了,但仍然没有解决我的问题。

编辑:

@Gregor 回答后,我编写了以下函数来解决问题

library(data.table)
library(dplyr)

replace_nth <- function(x, nth, code) {
  y <- data.table(x)
  y <- y[, code_rleid := rleid(y$Code)]
  y <- y[, seq := seq_along(Code), by = code_rleid]
  y <- y[seq == nth & Code == code, Code := 0]
  drop.cols <- c("code_rleid", "seq")
  y %>% select(-one_of(drop.cols)) %>% data.frame() %>% return()
}

要获得解决方案,只需运行replace_nth(df, 2, 1)

【问题讨论】:

  • 请详细说明您想要的输出。
  • 那么您希望替换哪个第 n 个值?是2号还是7号?还是 1 之后的第二个?
  • 有时你会提到连续出现,有时你不会。你没有在你的问题中给出一个样本n......这可能会更清楚。 Values 列重要吗?
  • 在此示例中,我想替换每 2 个连续出现的 1(在代码列中)。
  • data.table::rleid

标签: r dataframe replace


【解决方案1】:

使用data.table

library(data.table)
setDT(df)
df[, code_rleid := rleid(df$Code)]
df[, seq := seq_along(Code), by = code_rleid]
df[seq == 2 & Code == 1, Code := 0]
df
#    Values Code code_rleid seq
# 1:      1    1          1   1
# 2:      4    0          1   2
# 3:      5    2          2   1
# 4:      6    2          2   2
# 5:      3    2          2   3
# 6:      3    1          3   1
# 7:      2    0          3   2

您可以组合其中的一些(并在之后删除额外的列)。我会说清楚,让你随意修改。

【讨论】:

  • 完美。 rleid() 是我需要的。我将您的代码合并到我的函数中 - 请参阅编辑后的问题。谢谢
猜你喜欢
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2020-03-05
  • 2013-11-23
相关资源
最近更新 更多