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

Retrieve most common element in a multivalued attribute split by delimiter

我有一个由行组成的列,所有行都包含许多用“,”分隔的不同元素。此多值属性列 (CANDIDATE_SECTORS) 在每个单元格中包含许多元素(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 <- ""

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

所需结果的示例显示在 SECTOR_CAPABLE 列中,其中 "AE" 存储在 SECTOR_CAPABLE 列的第一行,因为它在该列中出现了两次行的 CANDIDATE_SECTORS 单元格。

我对 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) 
}

以逗号分隔,获取计数,获取最频繁的:

# 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

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