gpt4 book ai didi

r - 我如何快速找出两个(大)因素是否相互重新标记?

转载 作者:行者123 更新时间:2023-12-04 04:38:05 27 4
gpt4 key购买 nike

我有两个因子向量,怀疑它们在重新标记之前携带相同的信息。我如何找出这是否正确?

我的问题是,两个向量都相当长(200,000个条目),并且具有大量的级别(4,000个)。某些级别非常频繁,但是每个级别仅出现一次“长尾”。

这是一个可重现的示例(对不起,我无法找到一种方法来压缩它并仍然显示数据的属性):

foo <- structure(c(3213L, 428L, 104L, 59L, 23L, 17L, 15L, 9L, 5L, 6L, 
1L, 5L, 3L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Dim = 69L, .Dimnames = structure(list(
c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11",
"12", "13", "14", "15", "16", "23", "33", "83", "205", "246",
"255", "319", "374", "379", "389", "552", "566", "595", "686",
"750", "846", "965", "999", "1006", "1254", "1514", "1535",
"1605", "1687", "1744", "1792", "1937", "1946", "2166", "2198",
"2206", "2420", "2503", "2736", "2965", "2986", "3036", "3273",
"3734", "4026", "4073", "4279", "5038", "5040", "5185", "5607",
"6298", "6609", "6930", "15392", "21083", "22933", "29357"
)), .Names = ""), class = "table")
bar <- as.numeric(rep(names(foo),times=foo))
factor.1 <- as.factor(rep(paste0("a",sprintf("%04i",1:length(bar))),times=bar))
set.seed(1)
factor.2 <- as.factor(sample(gsub("a","b",unique(factor.1)),length(unique(factor.1)))[
as.numeric(factor.1)])

完成本练习后, factor.1factor.2只是彼此的重新标记。那么,我们如何找出这种情况是否适用于新的向量呢?

无效的事情:
  • 内部整数编码不需要相同,因此只需检查cor(as.numeric(factor.1),as.numeric(factor.2))==1是否将不起作用。
  • 我尝试检查factor.1的每个因子水平是否与factor.2的一个因子水平完全对应,反之亦然。不幸的是,这花费了太长时间,耗时数小时:
    foo <- by(factor.1,factor.2,FUN=function(zz)length(unique(zz)))
    bar <- by(factor.2,factor.1,FUN=function(zz)length(unique(zz)))
    all(foo) & all(bar)
  • 如果我们可以将factor.1用作预测变量,反之亦然,则可以完美地将factor.2拟合到多项式模型中,则两者都携带相同的信息。不幸的是,nnet::multinom(factor.1~factor.2)产生了可怕的“无法分配大小为XX的向量”错误。 randomForest::randomForest()至少可以给我们一个概率性的答案,它不能处理超过53个水平的因子。
  • 我们可以运行table(factor.1,factor.2)并检查每一行是否正好有一个非零条目。再次耗尽内存。
  • 最佳答案

    第一个函数计算其参数的唯一元素的数量,如果每个y级别都有一个x级别,则第二个函数返回TRUE。如果是,对于factor.1和factor.2,如果它们使用相同数量的级别,则一个将重新标记另一个。使用给定的数据,它会立即返回,因此看起来非常快。最后一行是您的一个想法的较快版本。使用其中之一。

    cnt <- function(x) length(unique(x))
    all_one <- function(x, y) all(tapply(unclass(x), y, cnt) == 1)

    # solution 1
    all_one(factor.1, factor.2) && cnt(factor.1) == cnt(factor.2)

    # solution 2
    all_one(factor.1, factor.2) && all_one(factor.2, factor.1)

    关于r - 我如何快速找出两个(大)因素是否相互重新标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32462544/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com