在另一个内部使用rep来根据另一个向量拉伸向量

时间:2018-10-15 12:42:05

标签: r apply sapply

我想生成一个data.frame的边。当许多边缘在一个节点上结束时,就会出现问题。边缘在向量fromto中定义。

# Data
vertices <- data.frame(id = 1:3, label = c("a", "b", "c"), stringsAsFactors = FALSE)
to <- c("a", "b", "c")
from1 <- c("c", "a", "b")
from2 <- c("c", "a", "a,b,c")

我尝试过的事情:

# Attempt 1
create_edges_1 <- function(from, to) {
  to <- sapply(to, function(x){vertices$id[vertices$label == x]})
  from <- sapply(from, function(x){vertices$id[vertices$label == x]})
  data.frame(from = from, to = to, stringsAsFactors = FALSE)
}

例如create_edges_1(from1, to),它的输出是:

  from to
c    3  1
a    1  2
b    2  3

例如,from2尝试失败。

所以我尝试了以下操作:

# Attempt 2
create_edges_2 <- function(from, to) {
  to <- sapply(unlist(sapply(strsplit(to, ","), function(x){vertices$id[vertices$label == x]})), function(x){rep(x, sapply(strsplit(from2, ","), length))})
  from <- unlist(sapply(strsplit(from2, ","), function(x){vertices$id[vertices$label == x]}))
  data.frame(from = from, to = to, stringsAsFactors = FALSE)
}

这个想法是要为每个边缘结束的节点“拉伸” to。但是create_edges_2(from1, to)create_edges_2(from2, to)都抛出错误

  

rep(x,sapply(strsplit(from2,“,”),length))中的错误:     无效的“时间”参数

sapply语句中我在做什么错了?

create_edges_2(from2, to)的预期输出为:

  from to
     3  1
     1  2
     1  3
     2  3
     3  3

2 个答案:

答案 0 :(得分:2)

您可以为此使用联接或document.addEventListener('DOMContentLoaded', function() { console.log("f") var checkPageButton = document.getElementById('checkPage'); checkPageButton.addEventListener('click', function() { console.log("f") chrome.tabs.getSelected(null, function(tab) { d = document; var f = d.createElement('form'); f.action = 'http://gtmetrix.com/analyze.html?bm'; f.method = 'post'; var i = d.createElement('input'); i.type = ''; i.name = 'url'; i.value = tab.url; f.appendChild(i); d.body.appendChild(f); f.submit(); console.log("a") console.log(f) }); }, false); }, false);

match

使用f2 <- strsplit(from2, ',') df <- data.frame(from = unlist(f2) , to = rep(to, lengths(f2)) , stringsAsFactors = FALSE)

match

具有联接

library(tidyverse)

map_dfc(df, ~ with(vertices, id[match(.x, label)]))

# # A tibble: 5 x 2
#    from    to
#   <int> <int>
# 1     3     1
# 2     1     2
# 3     1     3
# 4     2     3
# 5     3     3

答案 1 :(得分:1)

这是一种方法:

# Attempt 3
library(dplyr)
to <- sapply(to, function(x){vertices$id[vertices$label == x]})
from0 <- sapply(from2, function(x) strsplit(x, ",")) %>% unlist() %>% as.character()
lengths0 <- lapply(sapply(from2, function(x) strsplit(x, ",")), length) %>% unlist()

to0 <- c()
for( i in 1:length(lengths0)) to0 <- c(to0, rep(to[i], lengths0[i]))

from <- sapply(from0, function(x){vertices$id[vertices$label == x]})
edges <- data.frame(from = from, to = to0, stringsAsFactors = FALSE)
edges

根据要求提供此结果:

  from to
1    3  1
2    1  2
3    1  3
4    2  3
5    3  3

这个想法是用逗号分隔符分割from,并存储每个元素的大小,以便“拉伸”每个节点。这是通过for循环

完成的