微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将多个值传播到 R 中数据框中的唯一值

如何解决将多个值传播到 R 中数据框中的唯一值

假设我有一个包含名称列表的数据框:

> 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_extensiontidyr::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
,

使用 dplyrtidyr,您可以:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。