【问题标题】:Apply a rule only if one unique value in the column R仅当列 R 中有一个唯一值时才应用规则
【发布时间】:2021-10-21 05:38:21
【问题描述】:

我正在为下面的代码苦苦挣扎。我的目标是仅当只有一个价格与其他价格不同时才使用模式重写价格。我知道使用 n()==1 我们可以选择没有重复的唯一价格,但是只有在有一个这样的价格时才能添加它。尝试使用 count(),但出现错误。

      library("dplyr")
      
      Mode <- function(x) {
      ux <- unique(x)
      ux[which.max(tabulate(match(x, ux)))]
      }
      pp <- pp %>% 
      group_by(PPCODE) %>% 
      mutate(PRICE = ifelse(count(n() == 1)==1, Mode(PRICE), PRICE), .keep="unused")

dput 的输出:

structure(list(OUTLETID = c("11N", "12B", "17C", 
"44Oo", "1NN", "5CC", "AA1", "11A"), PPCODE = c(4623, 
4623, 4623, 4111, 4111, 4623, 4111, 4111), 
PRICE = c(1.45, 1.45, 1.45, 5.11, 5.11, 1.42, 5.13, 4.5))), 
row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))

因此,在第一个 ppcode 4623 价格应该更改,因为只有一个价格不同(1.42 应该更改为 1.45),但对于第二个 ppcode,它们应该保持原样(因为 2 个价格与模式不同 4.5 和 5.13) .

【问题讨论】:

  • 请使用dput(pp)分享您的数据reproductible example。
  • 分享模拟数据,显示您需要做什么。我们不关心您的实际数据
  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。
  • @MonJeanJean 已更新

标签: r dataframe dplyr


【解决方案1】:

您可以使用sum(PRICE != Mode(PRICE)) 计算每组中有多少值与模式不同,如果小于等于 1,则应用Mode 函数。

library(dplyr)

pp %>% 
  group_by(PPCODE) %>%
  mutate(PRICE = if(sum(PRICE != Mode(PRICE)) <= 1) Mode(PRICE) else PRICE) %>%
  ungroup

#  OUTLETID PPCODE PRICE
#  <chr>     <dbl> <dbl>
#1 11N        4623  1.45
#2 12B        4623  1.45
#3 17C        4623  1.45
#4 44Oo       4111  5.11
#5 1NN        4111  5.11
#6 5CC        4623  1.45
#7 AA1        4111  5.13
#8 11A        4111  4.5 

【讨论】:

  • 关闭,但不完全正确。如果有多个唯一价格,但仅当一个价格不同时,我想应用模式。因此,正如我在 ppcode 4111 的问题中所写,它们不应更改,因为 2 个价格与模式不同,只有 4623 才应应用此规则(因为有一个价格不同)。
  • @Bambeil 你能试试更新的答案吗?
猜你喜欢
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 2017-12-18
  • 1970-01-01
  • 2012-07-28
相关资源
最近更新 更多