【问题标题】:R dplyr resolve variable in conditional filterR dplyr 在条件过滤器中解析变量
【发布时间】:2017-05-17 22:36:09
【问题描述】:

我正在尝试根据变量值进行过滤,并且尝试了多种过滤器_、点和引号的组合,但均无济于事。

举个例子,我有一个

runlist = c(1, 2, 3, 4, 5) 

还有一个数据框嘘

run <- rep(seq(5), 3)
edge1 <- sample(20, 15)
edge2 <- sample(20, 15)
weights <- sample(50, 15)
boo <- as.data.frame(cbind(run, edge1, edge2, weights))

我想过滤一个名为 boo 的数据框,它可能看起来像 迭代为

for (i in runlist) {
    bop <- boo %>% filter( run == i )
    str(boo)
}

我怀疑我会听说不使用 for 循环和 R,而是使用 group_by(run),但我将此数据发送到 igraph 并且需要进一步将数据集子集为边缘和权重,从而丢失分组变量,如

bop <- boo %>% filter( run == i ) %>% select( edge1, edge2, weights )

我将创建一个网络图并找出每次运行的密度和中心度值。

bing <- graph.data.frame(bop)

如何让条件过滤器中的i 解析为正确的索引?

【问题讨论】:

  • 改用for (i in unique(boo$run))
  • @Nate Day 哇,是的,这行得通。您能否向我解释为什么您的建议有效,而 runlist = unique(boo$run) 和索引 runlist 无效?以及如何正确@您有空格的句柄?

标签: r filter dplyr standard-evaluation


【解决方案1】:

我的回答不是关于“在条件过滤器中解析变量”,而是有一种更简单的方法来做你想做的事情。

最大的想法是根据变量run 拆分数据帧,并将一个函数映射到每个片段上。该函数获取数据帧的一部分并输出一个 igraph。

下面的代码完成了上述操作,在graph 列中存储了一个图表列表。 (这是一个列表列,在R for data science book 上查看更多信息)

boo %>%
  group_by(run) %>%
  nest() %>%
  mutate(graph = map(data, function(x) graph.data.frame(x %>% select(edge1, edge2, weights)))) %>%
  mutate(density = map(graph, function(x) graph.density(x))

【讨论】:

  • 耐人​​寻味。 . .我会尝试一下,看看我是否可以获得我想要的中心性和密度统计数据。我喜欢你是否将选择插入到图形调用中。
  • 所以我得到了图表的列表列,但是我没有成功地单独使用图表来获取密度和中心性统计数据。我什至反映了您的建议并尝试了PDensities &lt;- PGraphs %&gt;% mutate(PDensity = map(data, function(x) graph.density(x))),但收到 Not a graph object 错误消息。也感谢您发送文档链接,非常有趣,但它推荐使用看起来不整洁的网络图的扫帚。例如,我将如何获得每个图表的 graph.density ?我很想用这个方法。
  • 每个图都存储为数据框中的一个单元格。您可以像往常一样使用my_dataframe[2, 3] 提取第二行和第三列的图形。可能有一个更有效的映射操作,它将提取函数映射到列表列的每个单元格。但基本思想是,您可以像从任何列中一样从列表列中提取内容。
  • 我在管道中添加了一个操作,该操作接收图表并吐出密度。
  • 这行得通,而且速度很快。非常感谢,我正在使用这个。
猜你喜欢
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
相关资源
最近更新 更多