【发布时间】: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