R 对于每行,将字符指定给该行中的第一个最高值

R 对于每行,将字符指定给该行中的第一个最高值,r,algorithm,loops,R,Algorithm,Loops,在我的数据中,人们(id)对(1-3)个主题(A、B、C、D、E)进行评分。我想把ID分配给他们最高分的主题。我将主题的“受欢迎程度”计算为最大值评级的总和,例如,主题B只有一个三星级评级,而主题A有三个三星级评级 现在,我正在寻找一个解决以下问题的循环(假设数据已经由流行程度排列): 对于每一行,找到该行中最大值的第一次出现(存在歧义)。(不计算受欢迎程度) 保存生成的行-列组合,例如,将主题字符替换为第一个最大值,并设置该行中的所有值NA 库(tidyverse) 数据% 变异(流行度=

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

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

  • 对于每一行,找到该行中最大值的第一次出现(存在歧义)。(不计算受欢迎程度
  • 保存生成的行-列组合,例如,将主题字符替换为第一个最大值,并设置该行中的所有值
    NA
  • 库(tidyverse)
    数据%
    变异(流行度=行和(.==3),)%>%
    安排(人气)
    #初始数据
    主题id1 id2 id3 id4 id5 id6流行度
    1 B 2 3 1 2 1 1
    2 C 3 2 3 2 1 2
    3 D 1 3 2 3 1 2
    4 E 2 3 2 1 3 2
    5 A 1 3 1 3 2 3 3
    #循环一步后
    主题id1 id2 id3 id4 id5 id6流行度
    1b不含B不含NA不含1
    2 C 3 2 3 2 1 2
    3 D 1 3 2 3 1 2
    4 E 2 3 2 1 3 2
    5 A 1 3 1 3 2 3 3
    #在循环的第二步之后
    主题id1 id2 id3 id4 id5 id6流行度
    1b不含B不含NA不含1
    2碳碳钠钠钠钠钠钠2
    3 D 1 3 2 3 1 2
    4 E 2 3 2 1 3 2
    5 A 1 3 1 3 2 3 3
    
    我们可以通过使用向量化的
    max.col
    来查找包含
    max
    值的“id”列的每一行的列索引,而无需循环。然后,
    cbind
    将行序列和列索引添加到一个临时的
    矩阵
    ,该矩阵是为分配“主题”列中的值而创建的。将该模板数据集分配给“数据”的“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
    

    i1看起来很棒,让我想想。
    
    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