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

检索按分隔符拆分的多值属性中最常见的元素

  •  1
  • hello_friend  · 技术社区  · 6 年前

    我有一个由行组成的列,所有行都包含由“,”分隔的许多不同元素。此多值属性列(候选扇区)包含每个单元格中的许多元素(AE、AE、PPP、LSE、D、G、D、AE),以逗号分隔。如图所示:

     PROJEX_ID <- c("1","2","3","4")
     NAME <- c("Hi", "go", "the", "dart")
     CANDIDATE_SECTORS <- c("AE, PPP, AE, D", "PPP, D, G, D", "LSE, PPP, PPP", "G, D, H, D, G, G")
     PROJ_DATA <- data.frame(PROJEX_ID, NAME, CANDIDATE_SECTORS)
     PROJ_DATA$SECTOR_CAPABLE <- ""
    

    enter image description here

    我需要计算每个单元格中每个元素的数量,然后逐行存储最频繁出现的值。(例如,AE代表第1行,D代表第2行)等。如有任何帮助,将不胜感激。

    所需结果的示例显示在SECTOR\u-CAPABLE列中,其中“AE”存储在SECTOR\u-CAPABLE列的第一行中,因为它在该行的候选扇区单元格中出现了两次。

    我对R比较陌生,下面的代码就是我正在尝试的;据我所知,它产生了“AE”的统一答案,这是因为for循环计算的是元素在整个列中的所有单元格中出现的次数,。

    for(i in 1:nrow(PROJ_DATA)){ 
      CANDIDATE_PROJS_UNLISTED <- setNames(strsplit(as.character(PROJ_DATA$CANDIDATE_SECTORS), ","), PROJ_DATA$PROJEX_ID) 
      CANDIDATE_PROJS_UNLISTED_TMP <- stack(CANDIDATE_PROJS_UNLISTED) 
      CANDIDATE_PROJS_UNLISTED_TMP$ORDER <- ave(CANDIDATE_PROJS_UNLISTED_TMP$ind, CANDIDATE_PROJS_UNLISTED_TMP$ind, FUN = seq_along) 
      candidate_projs_unlisted_tmp <- as.data.frame(table(CANDIDATE_PROJS_UNLISTED_TMP),decreasing=T) 
      PROJ_DATA$SECTOR_CAPABLE <- head(CANDIDATE_PROJS_UNLISTED$values,1) 
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   zx8754 John Colby    6 年前

    按逗号拆分,获取计数,获取最频繁的:

    # example data
    df1 <- data.frame(
      x = c("c,a,b,b",
            "aa,bb,b,c,c,a",
            "d,d,b,b"), stringsAsFactors = FALSE)
    
    # get most frequent as new column
    df1$res <- sapply(df1$x, function(i) {
      z <- unlist(strsplit(i, "," ))
      names(sort(table(z), decreasing = TRUE)[1])
    })
    
    # result
    df1
    #               x res
    # 1       c,a,b,b   b
    # 2 aa,bb,b,c,c,a   c
    # 3       d,d,b,b   b
    

    注: 当出现平局时,你需要决定做什么。目前,结果是按字母顺序排序的,所以在第三排我们得到 b 而不是 d .