【问题标题】:Conditional operation on specific variable values对特定变量值的条件操作
【发布时间】:2014-08-01 14:15:55
【问题描述】:

我正在寻找一种通过变量值对数据框中的变量编写条件操作的方法,但我无法完全理解如何去做。

假设我有以下动物收容所摄入量的每日数据:

shelters <- data.frame(
    date = rep(seq(as.Date("2014-02-01"), length=10, by = "1 day"),10),
    animal = sample(c("dog","cat","goldfish"), 100, replace = T),
    intake = sample(1:10, 100, replace = T))

我想设置一个规则来增加数据框,以便当“动物”变量中某个动物的摄入量总和达到给定值时,在达到给定日期之后的每个“摄入量”值变为0。

假设每只动物的最大值如下:

dog = 90
cat = 100
goldfish = 85

我倾向于使用 cumsum,但如何在 cumsum 公式中指定特定的动物值?

【问题讨论】:

  • 图利亚。如果最大。值存储在与动物列按相同顺序排列的向量中,v1 &lt;- c(90,100, 85); indx &lt;- setNames(v1, unique(as.character(shelters$animal)))[as.character(shelteres$animal)]

标签: r


【解决方案1】:

试试:

 shelters$indx <- setNames(c(90,100,85), c("dog", "cat", "goldfish") )[as.character(shelters$animal)]

 library(dplyr)
 shelters%>% 
 arrange(date, animal)%>%
 group_by(animal) %>% 
 mutate(Sum=cumsum(intake), intake=ifelse(Sum >indx, 0, intake)) %>% 
 select(-indx, -Sum) %>%
 head()
 #       date animal intake
 #1 2014-02-01    cat      1
 #2 2014-02-01    cat      4
 #3 2014-02-01    cat      2
 #4 2014-02-01    cat      2
 #5 2014-02-01    dog      5
 #6 2014-02-01    dog      9

更新

如果你想让总和与最大值相同

  res <- shelters %>%
  arrange(date, animal)%>% 
  group_by(animal) %>% 
  mutate(Sum=cumsum(intake), index2 = ifelse(Sum>indx,intake-(Sum-indx), intake),
            intake= ifelse(index2<0,0, index2))%>% 
  select(-indx, -Sum, -index2)

  res %>% summarize(Sum=sum(intake))
  #Source: local data frame [3 x 2]

  #    animal Sum
  #1      cat 100
  #2      dog  90
  #3 goldfish  85

【讨论】:

  • 这似乎可行,谢谢 akrun。我唯一担心的是,实际上,数据集要大得多,每个都有数百个变量值和最大值。但是,我想我可以通过将最大值的查找列表与每个变量名称匹配来解决这个问题,类似于你对 indx 变量所做的事情
  • @Marc Tulia。我认为dplyr 应该可以很好地处理大型数据集。如果没有,你可以试试data.table
  • 我对这种方法有点困惑,因为我已经尝试实现它。我遇到的问题是,说“猫”指数 = 100。我想记录所有摄入量,这样当我总结它们时,它们等于 100,仅此而已。但是,假设 Sum = 95 并且行中的下一个数字是 10。在这种情况下,cumsum 函数不会计数到 100;它将在 95 处减少总和。我该如何解决这个问题?
  • @Marc Tulia。我认为在您引用的示例中您想要的方式不是很清楚。如果 Sum=95 并且下一个数字是 10,则当前方法将其设为 0。您希望下一个数字是 105 还是 100,然后全为 0??
  • Akrun,很抱歉。我希望它为 100,然后全为 0。所以我希望它继续计算“摄入量”直到 AND 包括它的索引——即使这意味着拆分下一个摄入量——然后是 0。
猜你喜欢
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
相关资源
最近更新 更多