我有以下表格:
<表类>
col1
col2
col3
col4
tbody><<tr>1 2 1 4 56 6 3 表类>
一个dplyr方法:
library(dplyr)
df %>%
rowwise() %>%
mutate(max_val = max(across(everything())),
repetition = sum(across(col1:col4) == max_val))
# A tibble: 2 × 6
# Rowwise:
col1 col2 col3 col4 max_val repetition
<int> <int> <int> <int> <int> <int>
1 1 2 1 4 4 1
2 5 6 6 3 6 2
基于R的方法:
df$max_val <- apply(df,1,max)
df$repetition <- rowSums(df[, 1:4] == df[, 5])
对于其他(非tidyverse)读者,基本R方法可以是:
df$max_val <- apply(df, 1, max)
df$repetition <- apply(df, 1, function(x) sum(x[1:4] == x[5]))
输出:
# col1 col2 col3 col4 max_val repetition
# 1 1 2 1 4 4 1
# 2 5 6 6 3 6 2
尽管dplyr已经添加了许多跨行处理数据的工具,但至少在我看来,坚持整洁的原则并始终将数据转换为"长"数据要容易得多。这些操作的格式
因此,这里有一个整洁的方法:
df %>%
mutate(row = row_number()) %>%
pivot_longer(cols = -row) %>%
group_by(row) %>%
mutate(max_val = max(value), repetitions = sum(value == max(value))) %>%
pivot_wider(id_cols = c(row, max_val, repetitions)) %>%
select(col1:col4, max_val, repetitions)
最后一个select()
只是为了按照您想要的顺序获得列。