r - 对于每一行,将字符分配给该行中的第一个最大值
问题描述
在我的数据中,人们 (id) 对主题 (A、B、C、D、E) 的评分为 (1-3)。我想将 ID 分配给他们评分最高的主题。我将主题的“流行度”计算为最大值评级的总和,例如主题 B 只有一个 3 星评级,而主题 A 有三个 3 星评级。
现在,我正在寻找一个解决以下问题的循环(假设数据已经由 排列popularity
):
- 对于每一行,找到该行中最大值的第一次出现(会有歧义)。(不计算
popularity
)。 - 保存生成的行列组合,例如将主题字符替换为第一个最大值出现并设置该行中的所有值
NA
。
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
解决方案
我们可以在没有循环的情况下执行此操作,方法是使用矢量化来查找“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
推荐阅读
- mysql - 当应用于 MySQL 表列中的变量时,+0E0 究竟做了什么?
- pandas - 计算不同年份的每日平均值(日期时间)
- django - Celery/systemd 不与我的 django 应用程序对话
- java - 如何将opentrace拦截器添加到restTemplate?
- reactjs - 使用 React 在按键上播放声音
- python - If else 具有多个条件的函数-Python
- java - 如何将 Mapstruct 与 Ad Hoc Setter 一起使用
- sql - 使用一张表过滤另一张表而不连接
- javascript - 更改 div 的背景颜色,如果它包含包含带有 jquery 的特定字符串的 href
- .net - .AsNoTracking() 不工作实体框架核心 5