R 在分组后使用子数据集

R 在分组后使用子数据集,r,dplyr,dataset,R,Dplyr,Dataset,假设我有一个数据集,其中graph_id从0到800 x y index graph_id 1 3327 535 0_0 0 2 3316 529 0_1 0 3 3307 2359 0_2 0 4 3296 652 0_3 0 5 3283 2999 0_4 0 6 3281 73 0_5 0 我想使用每个基于graph_id的子数据集作为管道中mutate的

假设我有一个数据集,其中graph_id从0到800

     x    y index graph_id
1 3327  535   0_0        0
2 3316  529   0_1        0
3 3307 2359   0_2        0
4 3296  652   0_3        0
5 3283 2999   0_4        0
6 3281   73   0_5        0
我想使用每个基于graph_id的子数据集作为管道中mutate的输入。 像这样:

test <- data %>%
  group_by(graph_id) %>%
  select(x, y) %>%
  dist()
所以

是否可以仅使用dplyr而不使用lapply执行此类操作

更新

其思想是基于子数据帧创建新列,而不创建其他变量。如果您在mutate(在我的例子中)中使用
{.}
来处理初始数据帧,那么这是可能的:

data <- 
  data %>%
  mutate(id  = {.} %>%
               group_by(graph_id) %>%
               select(x, y) %>%
               do(a = dist(.) %>% 
                    as.matrix() %>% 
                    melt(varnames = c("row", "col")) %>% 
                    mutate(weight = 1/value *100) %>%
                    filter(row < col) %>%
                    rename(from = row,
                           to = col) %>%
                    graph_from_data_frame(directed = F) %>%
                    fastgreedy.community() %>%
                    membership()) %>%
               .['a'] %>%
               unlist() %>% 
               unname())
数据%
变异(id={.}%>%
分组依据(图形id)%>%
选择(x,y)%>%
do(a=距离(%)%>%
as.matrix()%>%
熔化(varnames=c(“行”、“列”))%>%
变异(权重=1/值*100)%>%
过滤器(行<列%>%
重命名(从=行,
to=列)%>%
来自数据帧的图形(定向=F)%>%
fastgreedy.community()%>%
成员资格())%>%
.[a']%>%
取消列表()%>%
名称())

您是否尝试过
do(dist(.))
do
动词保持分组。谢谢!,它帮助了很多你想要的输出是什么
dist
将返回一个较低的三角形,因此需要更多的操作。如果您的输入组(子帧)有
m
行,那么您的输出将有
m*(m-1)/2
值(在具有
m-1
行和列的矩阵中),因此您不能仅将其分配给新列,并且
cbind
使其快速增长。您的输出可能包括两行索引(from和to)以及它们之间的距离,这就是您所想的吗?最初,我有一个完整图的数据框架:x,y-坐标,一个图的graph_id-id,我想使用
成员资格
快速贪婪社区
函数将这些图拆分为几个子图。输入是一个图(从子数据帧创建),输出是每个点的子图id(表示为初始数据帧中的一行),它解释了您希望如何对数据进行分组,而不是希望帧的外观。如果输出的行比输入的多,我不知道如何添加“初始数据帧中的行”。您是否可以更改示例数据,使其包括(例如)3个不同的组和每个组3-4行,并显示该示例输入的输出结果?不清楚的时候很难谈论。
data <- 
  data %>%
  mutate(id  = {.} %>%
               group_by(graph_id) %>%
               select(x, y) %>%
               do(a = dist(.) %>% 
                    as.matrix() %>% 
                    melt(varnames = c("row", "col")) %>% 
                    mutate(weight = 1/value *100) %>%
                    filter(row < col) %>%
                    rename(from = row,
                           to = col) %>%
                    graph_from_data_frame(directed = F) %>%
                    fastgreedy.community() %>%
                    membership()) %>%
               .['a'] %>%
               unlist() %>% 
               unname())