【问题标题】:How to apply a pre-designed function in dplyr with group_by function如何使用 group_by 函数在 dplyr 中应用预先设计的函数
【发布时间】:2021-04-10 23:48:45
【问题描述】:

我有一个如下所示的预先设计的功能,我检查并运行良好。

foo <- function(tmp2) {
  
tmp2[,"frontier_dummy"] <- 0
A=tmp2[1,"sd_R"] # minimum sd
tmp2[1,"frontier_dummy"] <- 1

for (i in 2:nrow(tmp2)) {
  
  # check whether sd_i < A
  if(tmp2[i,"sd_R"]<A){
    tmp2[i,"frontier_dummy"] <- 1
    A <- tmp2[i, "sd_R"]
  }
}
return(tmp2)
}

我想将此函数与 group_by 函数一起应用于 dplyr。我的代码如下:

trial2= tmp2%>% group_by(subset) %>% arrange(desc(mean_R),desc(sd_R)) %>%
  foo()

它可以工作,但是当我检查输出时,它不能将数据分成子集,然后为每个子集运行函数。谁能帮我弄清楚为什么?如何修改我的代码?

非常感谢!!!!!!

数据:

,id,mean_R,Var_R,sd_R,mean_over_sd,mean_ROI,子集 1,11813,3385.833333,3868920.967,1966.957286,1.7213558,55832.47936,3 2,4049,2150.625,4000830.839,2000.207699,1.075200841,67073.8136,6 3,11432,1959.4,2508571.822,1583.847159,1.23711432,69286.36564,4 4,15166,1600.357143,13464947.17,3669.461428,0.436128618,280618.3547,3 5,12061,1509.5,44193,210.221312,7.180527921,25810.03176,3 6,7749,1452.4,297037.3,545.0112843,2.664898951,71970.11657,2 7,10711,1433.461538,14059975.44,3749.663376,0.382290727,131054.4251,2 8,3068,1252.25,333918.25,577.8565999,2.167060133,42896.49156,4 9,11335,1111.125,133857.8393,365.8658761,3.036973581,61310.80272,2 10,5770,692.8,196306.1778,443.06453,1.563654847,59234.55409,2 11,10089,679.375,56943.58333,238.6285468,2.846998019,60651.76025,1 12,10674,674.6666667,241327.8667,491.2513274,1.373363549,24164.31565,2 13,11435,531.8333333,669476.5667,818.2154769,0.649991779,11331.40683,2 14,19957,518.16,314590.14,560.8833569,0.923828446,70713.39092,1 15,22841,430.2,114384.0833,338.2071604,1.272001455,49212.42332,2 16,10180,417.4615385,18061.4359,134.3928417,3.106278082,62303.42163,1 17,4390,326,32257.33333,179.6032665,1.815111754,17219.19576,2 18,15514,227,5875.333333,76.65072298,2.961485439,30676.16867,3 19,17619,212,57981.42857,240.7933317,0.880423052,57932.1208,1

【问题讨论】:

    标签: r dplyr group-by


    【解决方案1】:

    使用dplyr(甚至是基本R)应该有更好的方法来编写foo 函数。但是,由于您没有分享您的数据,也没有分享 foo 中到底发生了什么,我们保持 foo 函数不变,并更改我们应用该函数的方式。

    您可以使用group_split 根据subsetapply foo 中的唯一值将数据拆分为不同的数据帧,使用map 将每个数据帧拆分为每个数据帧。

    library(dplyr)
    library(purrr)
    
    tmp2%>% 
      arrange(desc(mean_R),desc(sd_R)) %>%
      group_split(subset) %>% 
      map_df(foo) -> result
    
    result
    

    【讨论】:

    • 嗨罗纳克!非常感谢您的帮助!我试过了,但我仍然收到如下错误:...在 group_split() 中被忽略,请使用 group_by(..., add = TRUE) %>% group_split()Error: 'tibbletmp2' is not an从 'namespace:tibble' 导出的对象。在 foo 函数中,我尝试做的是添加一个名为“frontier dummy”的新列,并根据标准(是否 > A)为每一行分配 0 或 1。您能帮我弄清楚我在分组拆分功能中遇到的错误吗?谢谢!
    • @JingyNiu 能否请您提供可重现格式的数据,以便我检查错误发生的原因?如果您的数据太大,请使用dput(tmp2)dput(head(tmp2, 20)) 的输出编辑您的帖子。
    • 谢谢罗纳克!!我不知道如何上传我的数据。我创建了一个类似上面的示例数据。如果不适用,请告诉我。
    • 我可以建议两个更改。 1) 在for 循环中的foo 函数中,而不是for (i in 2:nrow(tmp2)) { 使用for (i in seq_len(nrow(tmp2))) {。 2)通过取消分组数据框开始您的代码。 tmp2%&gt;% ungroup %&gt;% arrange(desc(mean_R),desc(sd_R)).......
    猜你喜欢
    • 2017-07-12
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多