【问题标题】:Format output for similar value in RR中类似值的格式输出
【发布时间】:2020-07-06 02:10:58
【问题描述】:

我希望基于idR 中使用catsprintf 打印/格式化输出:

输入:

a <- "1<--A ,1<--B ,1<--C ,1<--D"
b <- "A-->1 ,A-->2 ,A-->3 ,A-->4 ,A-->5 ,A-->6 ,B-->1 ,B-->2,C-->1,C-->3"

预期输出:

1 <-- A
      A --> 1
      A --> 2
      A --> 3
      A --> 4
      A --> 5
      A --> 6
1 <-- B
      B --> 1
      B --> 2
1 <-- C
      C --> 1
      C --> 3
1 <-- D

任何帮助将不胜感激。 我想在console 以及html 格式中显示此输出。

**注意:值可以全是字母,也可以全是数字,另外,我们也可以输入一个字符。

更新: 例如:

a <- "1111<--AA1 ,1111<--112 ,1111<--C1 ,1111<--DD"
b <- "AA1-->11 ,AA1-->222 ,AA1-->3 ,AA1-->4 ,AA1-->5 ,AA1-->6 ,112-->1 ,112-->2,C1-->1,C1-->3"


1111 <--  AA1
          AA1 --> 1
          AA1 --> 2
          AA1 --> 3
          AA1 --> 4
          AA1 --> 5
          AA1 --> 6
1111 <-- 112
         112 --> 1
         112 --> 2
1111 <-- C1
         C1 --> 1
         C1 --> 3
1111 <-- DD

【问题讨论】:

    标签: html r shiny dplyr r-markdown


    【解决方案1】:

    快速而肮脏的东西分解成小步骤(用于 R 控制台):

    library(stringr)
    ab <- paste(a, b, sep = ",")
    ab_split <- strsplit(ab, " *,")[[1]]
    ab_split_ordered <- ab_split[order(str_extract(ab_split, "[A-Z]"), str_extract(ab_split, "[0-9]"))]
    ab_split_ordered_spaced <- ifelse(grepl(">", ab_split_ordered), paste0("    ", ab_split_ordered), ab_split_ordered)
    cat(ab_split_ordered_spaced, sep = "\n")
    
    1<--A
        A-->1
        A-->2
        A-->3
        A-->4
        A-->5
        A-->6
    1<--B
        B-->1
        B-->2
    1<--C
        C-->1
        C-->3
    1<--D
    

    数据

    a <- "1<--A ,1<--B ,1<--C ,1<--D"
    b <- "A-->1 ,A-->2 ,A-->3 ,A-->4 ,A-->5 ,A-->6 ,B-->1 ,B-->2,C-->1,C-->3"
    

    更新示例:

    library(stringr)
    ab <- paste(a, b, sep = ",")
    ab_split <- strsplit(ab, " *,")[[1]]
    
    ids <- str_extract(ab_split, "^[^<-]+(?=-)|(?<=-)[^>-]+$")
    values <- str_extract(ab_split, "^[^<-]+(?=<)|(?<=>)[^>-]+$")
    
    ab_split_ordered <- ab_split[order(ids, values)]
    ab_split_ordered_spaced <- ifelse(grepl(">", ab_split_ordered), paste0(strrep(" ", max(nchar(values)) + 3), ab_split_ordered), ab_split_ordered)
    cat(ab_split_ordered_spaced, sep = "\n")
    
           112-->1
    1111<--112
           112-->2
           AA1-->11
    1111<--AA1
           AA1-->222
           AA1-->3
           AA1-->4
           AA1-->5
           AA1-->6
           C1-->1
    1111<--C1
           C1-->3
    1111<--DD
    

    数据:

    a <- "1111<--AA1 ,1111<--112 ,1111<--C1 ,1111<--DD"
    b <- "AA1-->11 ,AA1-->222 ,AA1-->3 ,AA1-->4 ,AA1-->5 ,AA1-->6 ,112-->1 ,112-->2,C1-->1,C1-->3"
    

    【讨论】:

    • 我喜欢这种方法,但如果我们两边都有数值怎么办。例如:12 --> 1、15-->4 等
    • @RushabhPatel 可以适应.. 但是如果 id 超过一个字符...等等。最好更清楚地定义可能的输入。
    • @RushabhPatel 我已经更新了示例...我想会有更多细节需要实现,但您应该能够根据需要修改步骤。
    【解决方案2】:

    这是一个基本的 R 方法。

    c <- c(a,b)
    d <- unlist(sapply(c,function(x){strsplit(x," ?,")}))
    
    Direction <- gsub(".*([<>]).*","\\1",d)
    Number <-  as.numeric(gsub(".*([0-9]).*","\\1",d))
    Letter <-  gsub(".*([A-Z]).*","\\1",d)
    
    data <- data.frame(Letter,Direction,Number)
    data <- data[with(data, order(Letter,Direction)),]
    result <- apply(data,1,function(x){
      ifelse(x["Direction"] == "<", 
             paste0(x["Number"]," ",x["Direction"],"-- ",x["Letter"],"      "),
             paste0("      ",x["Letter"]," --",x["Direction"]," ",x["Number"]))
      })
    cat(result,sep="\n")
    1 <-- A      
          A --> 1
          A --> 2
          A --> 3
          A --> 4
          A --> 5
          A --> 6
    1 <-- B      
          B --> 1
          B --> 2
    1 <-- C      
          C --> 1
          C --> 3
    1 <-- D     
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 2021-12-30
      • 2018-11-19
      • 1970-01-01
      相关资源
      最近更新 更多