问题描述
> x <- c("a","b","c")
> x <- as.data.frame(x)
# > x
# 1 a
# 2 b
# 3 c
我想将每个唯一名称(x,下)传播到每个名称(y,下)并在原始列之前创建一个新列,以便新数据框如下所示:
# > z
# x y
# a a
# a b
# a c
# b a
# b b
# b c
# c a
# c b
# c c
这是为了在网络已满的 igraph 中创建“从”“到”边列表。
我怎么能这样做?是否有我缺少的简单 tidyverse 解决方案?
解决方法
您可以使用 peas_plugin_loader_create_extension
或 tidyr::expand_grid
tidyr::crossing
这与基 R tidyr::expand_grid(a = x$x,b = x$x)
#tidyr::crossing(a = x$x,b = x$x)
# a b
# <chr> <chr>
#1 a a
#2 a b
#3 a c
#4 b a
#5 b b
#6 b c
#7 c a
#8 c b
#9 c c
类似,只是顺序不同。
expand.grid
,
使用 dplyr
和 tidyr
,您可以:
x %>%
mutate(y = x) %>%
complete(y,x)
y x
<fct> <fct>
1 a a
2 a b
3 a c
4 b a
5 b b
6 b c
7 c a
8 c b
9 c c
,
基本的 R 解决方案:
function onOpen(){
var ss1 = SpreadsheetApp.getActiveSpreadsheet();
var mysheet1 = ss1.getSheetByName("Table");
var values = mysheet1.getRange(2,2,mysheet1.getLastRow()).getValues();
var values2 = mysheet1.getRange(2,4,mysheet1.getLastRow()).getValues();
if (values == "ELECTRIC" && values2 == "CONTINUE"){
var ss2 = SpreadsheetApp.getActiveSpreadsheet();
var mysheet2 = ss2.getSheetByName("Table2");
var cell = mysheet2.getRange("H22");
for (var i = 0; i < 50; i++) {
cell.setBackground(i % 2 ? "WHITE" : "RED");
SpreadsheetApp.flush();
Utilities.sleep(500);
}
}
}
,
您还可以使用 expand
函数返回两列的所有可能组合:
library(tidyr)
x %>%
mutate(y = x) %>%
expand(x,y)
# A tibble: 9 x 2
x y
<chr> <chr>
1 a a
2 a b
3 a c
4 b a
5 b b
6 b c
7 c a
8 c b
9 c c
您也可以使用 crossing
函数:
x <- c("a","b","c")
x <- as.data.frame(x)
x$y <- c("a","c")
crossing(x$x,x$y) # But you can't just use it within a pipeline since the first argument is not data
# A tibble: 9 x 2
`x$x` `x$y`
<chr> <chr>
1 a a
2 a b
3 a c
4 b a
5 b b
6 b c
7 c a
8 c b
9 c c
,
如果您真的想使用 igraph
,这里可能是一种选择
make_full_graph(
length(x),directed = TRUE,loops = TRUE
) %>%
set_vertex_attr(name = "name",value = x) %>%
get.data.frame()
给出
from to
1 a a
2 a b
3 a c
4 b a
5 b b
6 b c
7 c a
8 c b
9 c c