rowwise()产生mean()和sum()的错误

rowwise()产生mean()和sum()的错误,r,dplyr,sum,mean,rowwise,R,Dplyr,Sum,Mean,Rowwise,我试图得到行中某些列的平均值和总和。此代码将生成数据集: library(tidyverse) test_data <- tibble(part_id = 1:5, a_1 = c("a", "b", "c", "d", "a"), a_2 = c("b", NA, "b", "a", "d"), a_3 = c("b", "b", "d", "d", "a

我试图得到行中某些列的平均值和总和。此代码将生成数据集:

library(tidyverse)

test_data <- tibble(part_id = 1:5,
                      a_1 = c("a", "b", "c", "d", "a"),
                      a_2 = c("b", NA, "b", "a", "d"),
                      a_3 = c("b", "b", "d", "d", "a"))


test_data <- test_data %>%
  mutate_at(vars(a_1, a_2), .funs = list(scored = ~case_when(
    . == "a" | . == "b" ~ 1,
    . == "c" ~ 0,
    . == "d" ~ -100)))

我还尝试了这个修改,包括了c函数,就像您列出每一列一样。这导致了以下错误:

library(tidyverse)

test_data <- test_data %>%
  rowwise() %>%
  mutate(a_total = base::sum(c(dplyr::select(., contains("scored"))), na.rm = TRUE),
         a_mean = base::mean(c(dplyr::select(., contains("scored"))), na.rm = TRUE)) %>%
  ungroup()

Error in base::sum(c(dplyr::select(., contains("scored"))), na.rm = TRUE) : 
  invalid 'type' (list) of argument
我怎样才能和rowwise合作?为什么这种行为与典型行为以及行和或行平均值如此不同

我很欣赏你的洞察力

问题是rowwise正在按行进行分组,sum、mean等在向量上进行工作。它基本上应用于单行data.frame。通过使用unlist进行换行,它将从data.frame转换为向量


如果您想继续使用rowwise,那么这里有另一种方法,它使用{rlang}捕获要求和和和平均的变量:

图书馆弹琴 测试数据%n名称 使用'rlang',以便'dplyr'能够识别变量名 测试数据%>% 行%>% mutea_sum=sumc!!!rlang::symsvars,na.rm=TRUE, a_平均值=平均值C!!!rlang::symsvars,na.rm=TRUE%>% 解组 >一个tibble:5x8 >第二部分a_1 a_2 a_3 a_1_得分a_2_得分a_总和a_平均值 > >1 1 a b 1 2 1 >2 2 b 1 NA 1 1 >33CBD0110.5 >4 d a d-1001-99-49.5 >5ADA1-100-99-49.5
由v0.3.0于2020-04-05创建,你实际上是在将一个列表传递给sum和means,使其运行,但它只给出了总计和总计平均值,而不是每一行。你可以尝试pmap方法吗?是的,我更想知道为什么它不能与rowwise一起工作,但你上面的评论解释了为什么它不能工作。我只是很惊讶没有一个工作区@Sabree问题是unlist会删除属性,它会一直得到整个列。我们可以用do吗?rowwise无论如何都没有那么有效
library(tidyverse)

test_data <- test_data %>%
  rowwise() %>%
  mutate(a_total = base::sum(dplyr::select(., contains("scored")), na.rm = TRUE),
         a_mean = base::mean(dplyr::select(., contains("scored")), na.rm = TRUE)) %>%
  ungroup()
Warning messages:
1: In mean.default(dplyr::select(., contains("scored")), na.rm = TRUE) :
  argument is not numeric or logical: returning NA
library(tidyverse)

test_data <- test_data %>%
  rowwise() %>%
  mutate(a_total = base::sum(c(dplyr::select(., contains("scored"))), na.rm = TRUE),
         a_mean = base::mean(c(dplyr::select(., contains("scored"))), na.rm = TRUE)) %>%
  ungroup()

Error in base::sum(c(dplyr::select(., contains("scored"))), na.rm = TRUE) : 
  invalid 'type' (list) of argument
library(dplyr)
test_data <- test_data %>%
                  rowwise() %>%
                  mutate(a_total = base::sum(unlist(dplyr::select(., 
                               contains("scored")), recursive = FALSE), na.rm = TRUE),
                         a_mean = base::mean(unlist(dplyr::select(., 
                               contains("scored")), recursive = FALSE), na.rm = TRUE)) %>%
                   ungroup()
library(purrr)
test_data  %>%
   mutate(a_total = pmap_dbl(select(., contains("scored")),
                    ~ sum(c(...), na.rm = TRUE)),
          a_mean =  pmap_dbl(select(., contains("scored")),
                    ~ mean(c(...), na.rm = TRUE)))