【问题标题】:R / dplyr: text in var1*var2 matrixR / dplyr:var1*var2 矩阵中的文本
【发布时间】:2020-10-12 03:39:15
【问题描述】:

我有三个变量。

va1 和 var2 是名称,例如。数据库表。

var3 存储(在字符串中)连接两个表所需的数据库表的列。

不失一般性:每个数据库表只有一个列可以与另一个数据库连接。

是否有可能在 R/dplyr 中获得一个 martix / tibble,其中 var1 是行,var2 是列,var3 是 var1*var2 组合的值?

一个示例数据框:

df <- data.frame(var1 = paste0("tab",c(seq(1:5),1,1)), 
                 var2 = paste0("tab",c(2,4,5,3,1,3,4)), 
                 var3 = letters[1:7])

预期结果:

      tab1 tab2 tab3 tab4 tab5
 tab1    -    a    f    g    -
 tab2    -    -    -    b    -
 tab3    -    -    -    -    c
 tab4    -    -    d    -    -
 tab5    e    -    -    -    -

如何获得?

谢谢!

【问题讨论】:

    标签: r dataframe matrix dplyr data-manipulation


    【解决方案1】:

    这不是一个非常优雅的基本 R 解决方案,但它仍然可以发挥作用。

    # create positions for final table
    df$row <- as.numeric(sub("\\D+", "", df$var1))
    df$col <- as.numeric(sub("\\D+", "", df$var2))
    
    # create vector of tables (combining names from var1 and var2)
    tables <- unique(c(df$var1, df$var2))
    
    m <- matrix("-", nrow = length(tables), ncol = length(tables),
                dimnames = list(tables, tables))
    for(i in 1:nrow(df))
      m[df$row[i], df$col[i]] <- df$var3[i]
    

    输出

    #      tab1 tab2 tab3 tab4 tab5
    # tab1 "-"  "a"  "f"  "g"  "-" 
    # tab2 "-"  "-"  "-"  "b"  "-" 
    # tab3 "-"  "-"  "-"  "-"  "c" 
    # tab4 "-"  "-"  "d"  "-"  "-" 
    # tab5 "e"  "-"  "-"  "-"  "-" 
    

    【讨论】:

    • 简单易行的解决方案。谢谢!
    【解决方案2】:
    library(dplyr)
    library(tidyr)
    
    > df %>% pivot_wider(names_from = "var1",values_from = "var3") %>%
    +   arrange(var2) %>% column_to_rownames("var2") %>% t()
    

    给予

         tab1 tab2 tab3 tab4 tab5
    tab1 NA   "a"  "f"  "g"  NA  
    tab2 NA   NA   NA   "b"  NA  
    tab3 NA   NA   NA   NA   "c" 
    tab4 NA   NA   "d"  NA   NA  
    tab5 "e"  NA   NA   NA   NA
    

    使用as.data.frame() 将其转换为df,as_tibble() 不要保留行名。如果您希望 NA 像“-”,请添加 coalesce("–")

    【讨论】:

    • 非常感谢!非常优雅的方式。
    【解决方案3】:
           df%>%
          spread(var2,var3,fill='-')
    

    【讨论】:

    • 请记住,Stack Overflow 不仅仅是为了解决眼前的问题,而是为了帮助未来的读者找到类似问题的解决方案,这需要了解底层代码。这对于我们社区的初学者和不熟悉语法的成员来说尤其重要。鉴于此,您能否edit 您的答案包括对您正在做什么的解释以及为什么您认为这是最好的方法?
    猜你喜欢
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2021-05-24
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多