代码之家  ›  专栏  ›  技术社区  ›  ZhouW

计算特定模式前的唯一值数?

r
  •  0
  • ZhouW  · 技术社区  · 6 年前

    数据框中有一列 df$moves 看起来是这样的:

    W1.e4 B1.d5 W2.c4 B2.e6 W3.Nc3 B3.Nf6 W4.cxd5 B4.exd5 W5.Bg5 
    W1.e4 B1.d5 W2.exd5 B2.Qxd5 W3.Nc3 B3.Qa5 W4.d4 B4.Nf6 W5.Nf3 B5.c6 W6.Ne5 B6.Bf5 
    W1.e4 B1.e5 W2.Nf3 B2.Nc6 W3.Bc4
    W1.e4 B1.e5 W2.Nf3 B2.Nf6
    W1.e4 B1.c5 W2.Nf3
    

    我想在字符“w2.”出现之前获取所有唯一值的计数。例如,在上面,我希望“w2”之前的唯一值的计数为 1 ,仅为最后一行,直至“w2”。第1行与第2行相同,第3行与第4行相同。

    怎么做?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Jaap    6 年前

    一种可能的方法是先提取零件 W2 以下内容:

    # option 1:
    vec <- substr(df$moves, 1, regexpr('W2\\.', df$moves) - 1)
    
    # option 2:
    vec <- sub('W2.*', '', df$moves)
    

    然后看看它们是否独特:

    sum(!duplicated(vec) & !duplicated(vec, fromLast = TRUE))
    

    它给出:

    > sum(!duplicated(vec) & !duplicated(vec, fromLast = TRUE))
    [1] 1
    

    它的作用是:

    • regexpr('W2\\.', df$moves) 提取位置 W2型 首先出现。
    • 减去 1 从这些位置将结果反馈给 substr 以下内容: substr(df$moves, 1, regexpr('W2\\.', df$moves) - 1) 那就先得到零件 W2型 .
    • 一种更简单的提取方法是使用 sub 而不是 子字符串 / regexpr -组合: sub('W2.*', '', df$moves) .
    • !duplicated(vec) & !duplicated(vec, fromLast = TRUE) 指示 vec 是独一无二的。
    • 把它包起来 sum 你可以得到之前唯一值的数目 W2型 .

    如果要计算唯一值的数目,而不是只出现一次的值,则可以这样做 sum(!duplicated(vec)) 属于 length(unique(vec))


    使用的数据:

    df <- structure(list(moves = c("W1.e4 B1.d5 W2.c4 B2.e6 W3.Nc3 B3.Nf6 W4.cxd5 B4.exd5 W5.Bg5", 
                                   "W1.e4 B1.d5 W2.exd5 B2.Qxd5 W3.Nc3 B3.Qa5 W4.d4 B4.Nf6 W5.Nf3 B5.c6 W6.Ne5 B6.Bf5", 
                                   "W1.e4 B1.e5 W2.Nf3 B2.Nc6 W3.Bc4", "W1.e4 B1.e5 W2.Nf3 B2.Nf6", "W1.e4 B1.c5 W2.Nf3")), 
                    .Names = "moves", class = "data.frame", row.names = c(NA, -5L))
    
        2
  •  0
  •   MKR    6 年前

    使用的选项 strsplit 具有 展望未来 split 参数为 split = " (?=W2\\.)" 可以是:

    length(unique(sapply(strsplit(df$Moves, split = " (?=W2\\.)", perl = TRUE), 
                                                           function(x)x[1])))
    
    #[1] 3
    
    # where the unique values are:
    unique(sapply(strsplit(df$Moves, split = " (?=W2\\.)", perl = TRUE),
                                                           function(x)x[1]))
    #[1] "W1.e4 B1.d5" "W1.e4 B1.e5" "W1.e4 B1.c5"
    

    正则表达式:

    " (?=W2\\.)"  -- space followed by W2.
    

    数据:

    df <- read.table(text = 
    "Moves
    'W1.e4 B1.d5 W2.c4 B2.e6 W3.Nc3 B3.Nf6 W4.cxd5 B4.exd5 W5.Bg5'
    'W1.e4 B1.d5 W2.exd5 B2.Qxd5 W3.Nc3 B3.Qa5 W4.d4 B4.Nf6 W5.Nf3 B5.c6 W6.Ne5 B6.Bf5' 
    'W1.e4 B1.e5 W2.Nf3 B2.Nc6 W3.Bc4'
    'W1.e4 B1.e5 W2.Nf3 B2.Nf6'
    'W1.e4 B1.c5 W2.Nf3'",
    header = TRUE, stringsAsFactors = FALSE)