【问题标题】:Compute row-wise counts using across or c_across使用cross或c_across计算行计数
【发布时间】:2021-02-19 00:05:48
【问题描述】:

我想问一个受this question asked years ago here in stack overflow启发的问题

给定数据框: 输入_df

  num_col_1 num_col_2 text_col_1 text_col_2
1         1         4        yes        yes
2         2         5         no        yes
3         3         6         no       <NA>

这段代码

library(dplyr)    
df %>%
  mutate(sum_yes = rowSums(.[c("text_col_1", "text_col_2")] == "yes"))

将产生这个新的数据帧

> output_df
  num_col_1 num_col_2 text_col_1 text_col_2 sum_yes
1         1         4        yes        yes       2
2         2         5         no        yes       1
3         3         6         no       <NA>       0

问题是,你如何对现代 dplyr 动词 acrossc_across 做同样的事情?

谢谢。

【问题讨论】:

    标签: r dplyr tidyverse rowwise


    【解决方案1】:

    1) c_across 这里c_across 返回一个包含其参数指示的列的单行小标题。

    library(dplyr)
    
    input_df %>%
      rowwise %>%
      mutate(sum = sum( c_across(starts_with("text")) == "yes", na.rm = TRUE)) %>%
      ungroup
    

    给予:

    # A tibble: 3 x 5
      num_col_1 num_col_2 text_col_1 text_col_2   sum
          <int>     <int> <chr>      <chr>      <int>
    1         1         4 yes        yes            2
    2         2         5 no         yes            1
    3         3         6 no         <NA>           0
    

    2) 跨越 这给出了相同的结果。 across 返回一个仅包含其参数所指示的列的 tibble。

    input_df %>%
      mutate(sum = rowSums( across(starts_with("text")) == "yes", na.rm = TRUE)) 
    

    对是的分数求和

    如果有兴趣将对应于 yes 值的分数相加:

    3) c_across

    library(dplyr)
    
    input_df %>%
      rowwise %>%
      mutate(sum = sum( c_across(starts_with("num")) * 
        (c_across(starts_with("text")) == "yes"), na.rm = TRUE)) %>%
      ungroup
    

    给予:

      # A tibble: 3 x 5
      num_col_1 num_col_2 text_col_1 text_col_2   sum
          <int>     <int> <chr>      <chr>      <int>
    1         1         4 yes        yes            5
    2         2         5 no         yes            5
    3         3         6 no         <NA>           0
    

    4) 跨越输出同(3)。

    input_df %>%
      mutate(sum = rowSums(across(starts_with("num")) * 
                     (across(starts_with("text")) == "yes"), na.rm = TRUE))
    

    注意

    可重现形式的输入:

    Lines <- "  num_col_1 num_col_2 text_col_1 text_col_2
    1         1         4        yes        yes
    2         2         5         no        yes
    3         3         6         no         NA"
    input_df <- read.table(text = Lines)
    

    【讨论】:

      猜你喜欢
      • 2016-04-29
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多