R语言 按行选择特定/所有列

hof1towb  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(583)

我有下表:
| 列1|第2列|第3列|第4列|
| - -|- -|- -|- -|
| 一个|2个|一个|四个|
| 五个|六个|六个|三个|
我的目标是找出每一行的最大值,然后找出它在同一行中重复了多少次。
结果表应如下所示:
| 列1|第2列|第3列|第4列|最大瓦尔|重复,重复|
| - -|- -|- -|- -|- -|- -|
| 一个|2个|一个|四个|四个|一个|
| 五个|六个|六个|三个|六个|2个|
为了实现这一点,我为Max做了以下工作:

df%>% rowwise%>%
mutate(max=max(col1:col4))

然而,我正在努力寻找重复。我的想法是在mutate中使用以下伪代码:sum(“全选当前行或只选部分列”==max)。但我不知道如何选择整行或只选择其中的部分列并使用其内容进行检查,即:它等于max吗?我们怎么在dplyr中做这个?

qnakjoqk

qnakjoqk1#

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])
bqf10yzr

bqf10yzr2#

对于其他(非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
d5vmydt9

d5vmydt93#

尽管dplyr增加了许多跨行数据处理的工具,但至少在我看来,坚持整洁的原则并始终将数据转换为“long”格式以进行此类操作要容易得多。
因此,这里有一个tidy方法:

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()只用于按您希望的顺序获取列。

相关问题