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