如何通过调用rgeom在数据框上创建新列

时间:2019-01-03 19:13:45

标签: r dplyr

我正在尝试计算事件发生的可能性。因此,这是一个分为两个阶段的过程:事件发生的概率以及每个事件持续多长时间

因此,我已经使用rbinom获得了事件发生多少次的10000次以上迭代的向量。然后,我想如果将其转换为数据框,则可以使用dplyr mutate将每个单独的行作为n参数传递给rgeom函数。但是我对每一行都得到相同的结果

年<-rbinom(10000,8760,0.0068)

平均(年)

year2 <-as.data.frame(year)

colnames(year2)[1] <-“测试”

year3 <-year2%>%变异(year = sum(rgeom(test,0.004)))

year3

我希望每一行的总和都不同,例如

测试年份

65 500

45411

就像您在mutate之外调用rgeom一样

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,那么问题在于您将年份设置为等于rgeom结果的总和。有10000个不同的结果,但只有一个总和。我相信这就是您想要的:

public void Stop(ProjectViewModel model)
    {
        ProjectManager manager = new ProjectManager();
        if (model.Servers != null && model.Servers.Count != 0)
        {
            string machine = model.Servers[0];
            foreach (string service in model.Services)
            {
                manager.StopService(service, machine);
                model.events.Add(service, "stopped");
                this.Session["Events"] = model.events;
            }
        }
        //return View(model);
    }

public void Message(ProjectViewModel model)
    {
        Thread.Sleep(1000);
        Response.ContentType = "text/event-stream";
        Response.CacheControl = "no-cache";
        Response.AddHeader("connection", "keep-alive");
        var events = this.Session["Events"] as Dictionary<string, string>;
        Response.Write($"event: message\n");
        if (events != null && events.Count != 0)
        {
            foreach (KeyValuePair<string, string> message in events)
            {
                Response.Write($"data: {message.Key} has been {message.Value}\n\n");
            }
        }
        Response.Flush();
        Thread.Sleep(1000);
        Response.Close();

    }

答案 1 :(得分:0)

问题在于,像sum()mutate()这样的汇总函数可以有效地汇总数据中的各个组。由于您尚未应用任何分组,因此它将在整个数据帧中求和。

无论如何,我为您提供了两种解决方案。首先,使用map_int包中的purrr函数-该函数将函数迭代地应用于您指定的列的每个元素-在这种情况下,是“测试”列:

library(dplyr)
library(purrr)

set.seed(1)
year <- 
  data.frame(test = rbinom(10000, 8760, 0.0068))

set.seed(1)
year3 <-
  year %>%
  mutate(year = map_int(test, ~sum(rgeom(., 0.04))))

head(year3)
#>   test year
#> 1   61 1369
#> 2   53 1430
#> 3   74 1568
#> 4   57 1483
#> 5   62 1294
#> 6   66 1619

或者,您可以使用rowwise()中的dplyr对数据帧进行分组,但是我要特别注意,因为它是tipped to be deprecated at some point

set.seed(1)
year <- 
  data.frame(test = rbinom(10000, 8760, 0.0068))

set.seed(1)
year3 <- 
  year %>% 
  rowwise() %>% 
  mutate(year = sum(rgeom(test, 0.04))) %>% 
  ungroup()

head(year3)
#> # A tibble: 6 x 2
#>    test  year
#>   <int> <int>
#> 1    61  1369
#> 2    53  1430
#> 3    74  1568
#> 4    57  1483
#> 5    62  1294
#> 6    66  1619