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

R cast无法处理唯一行

  •  1
  • CodeNoob  · 技术社区  · 7 年前

    问题


    我有 cluster.id 对应于这些簇。身份证我有不同的 letters 在每个簇中找到(作为简化)。

    我感兴趣的是,在不同的集群中通常可以找到哪些字母(我使用了下面的代码 answer )但是,我对找到每个字母的比例不感兴趣,所以我想删除重复的行(请参阅下面的代码)。

    这似乎很有效(没有错误),但演员表中充满了 'NA' 和字符串,而不是所需的计数(我在下面的代码注释中进一步解释了一切)。

    有什么建议可以解决这个问题吗?或者这只是在筛选唯一行后不可能实现的?

    密码


    test.set <- read.table(text = "
                                cluster.id   letters
                           1          4       A
                           2          4       B
                           3          4       B
                           4          3       A
                           5          3       E
                           6          3       D
                           7          3       C
                           8          2       A
                           9          2       E
                           10          1       A", header = T, stringsAsFactors = F)
    
    
    
    # remove irrelevant clusters (clusters which only contain 1 letter)
    test.set <- test.set %>% group_by( cluster.id ) %>%
      mutate(n.letters = n_distinct(letters)) %>%
      filter(n.letters > 1) %>%
      ungroup() %>%
      select( -n.letters)
    
    test.set
    #  cluster.id letters
    #<int>   <chr>
    #1          4       A
    #2          4       B
    #3          4       B
    #4          3       A
    #5          3       E
    #6          3       D
    #7          3       C
    #8          2       A
    #9          2       E
    
    
    
    # I dont want duplicated rows becasue they are misleading.
    # I'm only interested in which letters are found togheter in a 
    # cluster not in what proportions
    # Therefore I want to remove these duplicated rows
    
    test.set.unique <- test.set %>% unique()
    matrix <- acast(test.set.unique, cluster.id ~ letters)
    
    matrix
    #  A   B   C   D   E  
    #2 "A" NA  NA  NA  "E"
    #3 "A" NA  "C" "D" "E"
    #4 "A" "B" NA  NA  NA 
    
    
    # This matrix contains NA values and letters intead of the counts I wanted.
    # However using the matrix before filtering for unique rows works fine
    
    matrix <- acast(test.set, cluster.id ~ letters)
    matrix
    #  A B C D E
    #2 1 0 0 0 1
    #3 1 0 1 1 1
    #4 1 2 0 0 0
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   akrun    7 年前

    如果我们也查看这些消息,那么在输出上方会有一条消息

    缺少聚合函数:默认为长度

    为了获得类似的输出,请指定 fun.aggregate

    acast(test.set.unique, cluster.id ~ letters, length)
    #  A B C D E
    #2 1 0 0 0 1
    #3 1 0 1 1 1
    #4 1 1 0 0 0
    

    当存在重复元素时,默认情况下 享乐总数的 为触发 length . 具有 unique 元素,而不指定 享乐总数的 ,它将假设 value.var 列并填充该列的值,以获得OP post中的输出