首页 > 解决方案 > 将值与数据框中的前 n 个值进行比较

问题描述

给定这样的数据框:

df <- data.frame(ID = seq(1,8), fruit = c("apple", "orange", "kiwi", "pear", "orange", "kiwi", "apple", "apple"))

  ID  fruit
1  1  apple
2  2 orange
3  3   kiwi
4  4   pear
5  5 orange
6  6   kiwi
7  7  apple
8  8  apple

如何创建一个新列来标识一个值是否出现在前n行中?例如,如果 n = 3,我想要这样的输出:

  ID  fruit previous_3
1  1  apple      FALSE
2  2 orange      FALSE
3  3   kiwi      FALSE
4  4   pear      FALSE
5  5 orange       TRUE
6  6   kiwi       TRUE
7  7  apple      FALSE
8  8  apple       TRUE

标签: rdataframe

解决方案


带有shiftfrom的选项data.table

library(data.table)    
f_prev_n <- function(dat, colnm, n) {
         rowSums(sapply(data.table::shift(df[[colnm]], n = seq_len(n)), 
          function(x) dat[[colnm]] == x), na.rm = TRUE) > 0
}
df$previous_3 <- f_prev_n(df, 'fruit', 3)
df$previous_3
#[1] FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE

df$previous_6 <- f_prev_n(df, 'fruit', 6)
df$previous_6
#[1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE

推荐阅读