![](/img/trans.png)
[英]compute row-wise summary statistics such as mean, max, min across columns sharing similar names using dplyr
[英]Compute row-wise counts using across or c_across
我想問一個問題, 這個問題的靈感來自幾年前在堆棧溢出中提出的這個問題
給定數據框:input_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"))
將生產這個新的 dataframe
> 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 動詞 cross 和c_across做同樣的事情?
謝謝你。
1) c_across這里c_across
返回一個包含由其參數指示的列的單行 tibble。
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)cross這給出了相同的結果。 cross 返回一個僅包含其參數指示across
列的小標題。
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)跨output同(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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.