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

在R的data.frame中查找仅出现在一个集群中的变量

  •  0
  • rnorouzian  · 技术社区  · 6 年前

    使用基数R,我想知道如何回答以下问题:

    有什么价值吗 X Y (即,感兴趣的变量名)只出现在 m (作为一个集群)但不是其他?如果是,出示我的 期望输出 下面。

    例如: 我们看到了 X == 3 只出现在元素中 m[[3]] 但不是 m[[1]] m[[2]] . 我们也看到了 Y == 99 只发生在 m[[1]] 但不是其他人。

    注: 下面是一个玩具的例子,一个功能性的答案是赞赏的。以及 &安培; 是的 可以是数字,也可以不是数字(例如,是字符串)。

    f <- data.frame(id = c(rep("AA",4), rep("BB",2), rep("CC",2)), X = c(1,1,1,1,1,1,3,3), 
                Y = c(99,99,99,99,6,6,6,6))
    
    m <- split(f, f$id) # Here is `m`
    
    mods <- names(f)[-1] # variables of interest names
    

    期望输出:

    list(AA = c(Y = 99), CC = c(X = 3))
    
    # $AA
    # Y 
    # 99 
    
    # $CC
    # X 
    # 3 
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   d.b    6 年前
    tmp = do.call(rbind, lapply(names(f)[-1], function(x){
        d = unique(f[c("id", x)])
        names(d) = c("id", "val")
        transform(d, nm = x)
    }))
    
    tmp = tmp[ave(as.numeric(as.factor(tmp$val)), tmp$val, FUN = length) == 1,]
    
    lapply(split(tmp, tmp$id), function(a){
        setNames(a$val, a$nm)
    })
    #$AA
    # Y 
    #99 
    
    #$BB
    #named numeric(0)
    
    #$CC
    #X 
    #3
    
        2
  •  1
  •   jay.sf    6 年前

    这是一个基于 rapply() table() .

    ux <- rapply(m, unique)
    tb <- table(uxm <- ux[gsub(rx <- "^.*\\.(.*)$", "\\1", names(ux)) %in% mods])
    r <- Map(setNames, n <- uxm[uxm %in% names(tb)[tb == 1]], gsub(rx, "\\1", names(n)))
    setNames(r, gsub("^(.*)\\..*$", "\\1", names(r)))
    # $AA
    # Y 
    # 99 
    # 
    # $CC
    # X 
    # 3
    
    推荐文章