【问题标题】:Select specific columns in rowwise按行选择特定列
【发布时间】:2022-12-03 00:09:47
【问题描述】:

我有下表:

col1 col2 col3 col4
1 2 1 4
5 6 6 3

我的目标是找出每一行的最大值,然后找出它在同一行中重复了多少次。

结果表应如下所示:

col1 col2 col3 col4 max_val repetition
1 2 1 4 4 1
5 6 6 3 6 2

现在为了实现这一点,我正在为 Max 执行以下操作:

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

但是,我正在努力寻找重复。我的想法是在 mutate 中使用这个伪代码: sum( "完全选择当前行或仅选择某些列"==max).但我不知道如何选择整行或仅选择其中的某些列并使用其内容进行检查,即:它是否等于最大值。我们如何在 dplyr 中做到这一点?

【问题讨论】:

标签: r dplyr


【解决方案1】:

一种 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])

【讨论】:

  • 所以答案是使用:across(everything())来选择所有当前行的列值,使用across(colname:colname)来进行特定的选择。谢谢!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    尽管 dplyr 添加了许多用于跨行数据处理的工具,但至少在我看来,坚持整洁原则并始终将数据转换为“长”格式以进行此类操作要容易得多。

    因此,这是一个 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()只是为了按照你想要的顺序获取列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      相关资源
      最近更新 更多