【发布时间】: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 也许你可以告诉我如何添加这个标志?
-
只需将其添加到您修改
PRICE的mutate调用中。