Как применить предварительно разработанную функцию в dplyr с помощью функции group_by

#r #dplyr #group-by

#r #dplyr #группировка по

Вопрос:

У меня есть предварительно разработанная функция, подобная приведенной ниже, которую я проверил и которая хорошо работает.

 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)
}
 

Я хотел бы применить эту функцию к dplyr вместе с функцией group_by. У меня есть мой код, как показано ниже:

 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

Ответ №1:

С dplyr помощью (или даже базового R) должен быть лучший способ написания foo функции. Однако, поскольку вы не поделились своими данными и не поделились тем, что именно происходит, foo мы оставляем foo функцию нетронутой и изменяем способ применения функции.

Вы можете использовать group_split для разделения данных на разные фреймы данных на основе уникальных значений в subset и apply foo для каждого фрейма данных с использованием map .

 library(dplyr)
library(purrr)

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

result
 

Комментарии:

1. Привет, Ронак! Большое спасибо за помощь! Я пытался, но все равно получаю сообщение об ошибке, подобное приведенному ниже: … игнорируется в group_split(<grouped_df>), пожалуйста, используйте group_by(…, add = TRUE) %>% Ошибка group_split(): ‘tibbletmp2’ не является экспортированным объектом из ‘namespace: tibble’ . В функции foo я пытаюсь добавить новый столбец с именем «frontier dummy» и присвоить 0 или 1 для каждой строки на основе критериев (будь то> A). Не могли бы вы, пожалуйста, помочь мне разобраться с ошибкой, которую я получил для функции разделения группы? Спасибо!

2. @JingyNiu Не могли бы вы предоставить данные в воспроизводимом формате, чтобы я мог проверить, почему возникает ошибка? Отредактируйте свой пост с выводом dput(tmp2) или dput(head(tmp2, 20)) , если ваши данные слишком большие.

3. Спасибо, Ронак!! Я не понял, как загрузить свои данные. Я создал пример данных, как указано выше. Пожалуйста, дайте мне знать, если это неприменимо.

4. Я могу предложить два изменения. 1) В foo функции в for цикле вместо for (i in 2:nrow(tmp2)) { использования for (i in seq_len(nrow(tmp2))) { . 2) Начните свой код с разгруппировки фрейма данных. tmp2%>% ungroup %>% arrange(desc(mean_R),desc(sd_R)).......