检索按分隔符拆分的多值属性中最常见的元素
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
。
我有一个由行组成的列,所有行都包含许多用“,”分隔的不同元素。此多值属性列 (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
。