首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用跨或c_across计算逐行计数

使用跨或c_across计算逐行计数
EN

Stack Overflow用户
提问于 2021-02-19 00:05:48
回答 1查看 259关注 0票数 0

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

给定数据框架: input_df

代码语言:javascript
复制
  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>

这段代码

代码语言:javascript
复制
library(dplyr)    
df %>%
  mutate(sum_yes = rowSums(.[c("text_col_1", "text_col_2")] == "yes"))

将产生这种新的数据

代码语言:javascript
复制
> 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动词跨和c_across进行相同的处理?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-02-19 00:16:32

1) c_across c_across返回一行tibble,其中包含其参数所指示的列。

代码语言:javascript
复制
library(dplyr)

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

给予:

代码语言:javascript
复制
# 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。

代码语言:javascript
复制
input_df %>%
  mutate(sum = rowSums( across(starts_with("text")) == "yes", na.rm = TRUE)) 

把分数加起来表示是

如果有兴趣将与“是”值相对应的分数相加:

3) c_across

代码语言:javascript
复制
library(dplyr)

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

给予:

代码语言:javascript
复制
  # 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)相同。

代码语言:javascript
复制
input_df %>%
  mutate(sum = rowSums(across(starts_with("num")) * 
                 (across(starts_with("text")) == "yes"), na.rm = TRUE))

备注

可复制形式的输入:

代码语言:javascript
复制
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)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66269962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档