【问题标题】:Filter only rows which were changed仅过滤已更改的行
【发布时间】:2021-12-31 21:28:10
【问题描述】:

如果符合给定条件,则以下代码将价格更改为模式价格,如果不匹配,则价格保持不变。

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

digits_different <- function(mode, price){
  mode <- str_split(as.character(mode), "")[[1]]
  price <- str_split(as.character(price), "")[[1]]
  
  if(length(mode) < length(price)){
    mode <- c(mode, "0")
  }
  else if(length(price) < length(mode)) {
    price <- c(price, "0")
  }
  
  sum(mode != price)
}

df <- df %>% group_by(PPCODE) %>% filter(sum(PRICE != Mode(PRICE)) == 1) 

df <- df %>%  
   group_by(CODE) %>%
   summarise(MODE = Mode(PRICE)) %>% 
   right_join(dfn, by = "CODE") %>% 
   rowwise() %>% 
   mutate(
       PRICE = ifelse(digits_different(PRICE, MODE) == 1, MODE, PRICE)
      ) %>%
   select(-MODE) %>% 
   ungroup 

是否有可能使用 R 以某种方式仅过滤价格更改的行?

【问题讨论】:

  • 添加一个标志以指示哪些行已更改,然后对其进行过滤。或者将PRICE 的原始值保存在OLD_PRICE 中,然后过滤PRICE != OLD_PRICE。但如果采用后一种方法,请注意数值精度问题。
  • @Limey 也许你可以告诉我如何添加这个标志?
  • 只需将其添加到您修改PRICEmutate 调用中。

标签: r dataframe dplyr filter


【解决方案1】:

这是实现@Limey 建议的一种方法:

df <- df %>%  
   group_by(CODE) %>%
   summarise(MODE = Mode(PRICE)) %>% 
   right_join(dfn, by = "CODE") %>% 
   rowwise() %>% 
   mutate(
       FLAG = ifelse(digits_different(PRICE, MODE) == 1, 1, 0) # addition of flag to mutate
       PRICE = ifelse(digits_different(PRICE, MODE) == 1, MODE, PRICE)
      ) %>%
   select(-MODE) %>% 
   ungroup () %>%
   filter(FLAG == 1) # new filter condition

这是另一个保持列分开,而不是覆盖现有列

df <- df %>%  
   group_by(CODE) %>%
   summarise(MODE = Mode(PRICE)) %>% 
   right_join(dfn, by = "CODE") %>% 
   rowwise() %>% 
   mutate(
       OLD_PRICE = PRICE # store the existing price so it is not overwritten
       NEW_PRICE = ifelse(digits_different(PRICE, MODE) == 1, MODE, PRICE)
      ) %>%
   select(-MODE) %>% 
   ungroup () %>%
   filter(OLD_PRICE != NEW_PRICE) # new filter condition

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2017-12-06
    相关资源
    最近更新 更多