首页 > 解决方案 > 对于每一行,将字符分配给该行中的第一个最大值

问题描述

在我的数据中,人们 (id) 对主题 (A、B、C、D、E) 的评分为 (1-3)。我想将 ID 分配给他们评分最高的主题。我将主题的“流行度”计算为最大值评级的总和,例如主题 B 只有一个 3 星评级,而主题 A 有三个 3 星评级。

现在,我正在寻找一个解决以下问题的循环(假设数据已经由 排列popularity):

    library(tidyverse)
    data <- data.frame(topic = c("A", "B", "C", "D", "E"), 
               id1 = c(1,2,3,1,2), 
               id2 = c(3,3,2,1,3),
               id3 = c(1,1,3,3,2),
               id4 = c(3,1,2,2,1),
               id5 = c(2,2,1,3,1),
               id6 = c(3,1,1,1,3)) %>% 
      mutate(popularity= rowSums(. == 3),) %>%
      arrange(popularity)
    
    # Initial Data
      topic id1 id2 id3 id4 id5 id6 popularity
    1     B   2   3   1   1   2   1         1
    2     C   3   2   3   2   1   1         2
    3     D   1   1   3   2   3   1         2
    4     E   2   3   2   1   1   3         2
    5     A   1   3   1   3   2   3         3
    
    # After one step of the loop
      topic id1 id2 id3 id4 id5 id6 popularity
    1     B   NA  B   NA  NA  NA  NA        1
    2     C   3   2   3   2   1   1         2
    3     D   1   1   3   2   3   1         2
    4     E   2   3   2   1   1   3         2
    5     A   1   3   1   3   2   3         3
    
    # After second step of the loop
      topic id1 id2 id3 id4 id5 id6 popularity
    1     B   NA  B   NA  NA  NA  NA        1
    2     C   C   NA  NA  NA  NA  NA        2
    3     D   1   1   3   2   3   1         2
    4     E   2   3   2   1   1   3         2
    5     A   1   3   1   3   2   3         3

标签: ralgorithmloops

解决方案


我们可以在没有循环的情况下执行此操作,方法是使用矢量化来查找“id”列max.col的值所在的每一行的列索引。max然后,cbind使用行序列和列索引来临时matrix创建以从“主题”列分配值。将该模板数据集分配给“数据”的“id”列

i1 <- startsWith(names(data), "id")
m1 <- matrix(NA, nrow(data), sum(i1))
m1[cbind(seq_len(nrow(m1)), max.col(data[i1], 'first'))] <- data$topic
data[i1] <- m1

-输出

data
#  topic  id1  id2  id3  id4  id5  id6 popularity
#1     B <NA>    B <NA> <NA> <NA> <NA>          1
#2     C    C <NA> <NA> <NA> <NA> <NA>          2
#3     D <NA> <NA>    D <NA> <NA> <NA>          2
#4     E <NA>    E <NA> <NA> <NA> <NA>          2
#5     A <NA>    A <NA> <NA> <NA> <NA>          3

推荐阅读