首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >总结在dplyr dplyr()中使用多个函数

总结在dplyr dplyr()中使用多个函数
EN

Stack Overflow用户
提问于 2020-11-06 11:45:19
回答 1查看 304关注 0票数 1

我有一些数据,其中id变量应该标识唯一的观察值。但是,有些ids是重复的。我想通过按id分组,然后计算每个变量不一致响应的比例,来了解是哪些度量驱动了这种重复。

下面是我的意思的一个例子:

代码语言:javascript
运行
复制
require(tidyverse)

df <- tibble(id = c(1,1,2,3,4,4,4),
             col1 = c('a','a','b','b','c','c','c'), # perfectly consistent
             col2 = c('a','b','b','b','c','c','c'), # id 1 is inconsistent - proportion inconsistent = 0.25
             col3 = c('a','a','b','b','a','b','c'), # id 4 is inconsistent - proportion inconsistent = 0.25
             col4 = c('a','b','b','b','b','b','c') # id 1 and 4 are inconsistent - proportion inconsistent = 0.5
             )

我可以使用group_by()、across()和n_distinct()在I中测试不一致的响应,如下所示:

代码语言:javascript
运行
复制
# count the number of distinct responses for each id in each column
# if the value is equal to 1, it means that all responses were consistent
df <- df %>% 
  group_by(id) %>% 
  mutate(across(.cols = c(col1:col4), ~n_distinct(.), .names = '{.col}_distinct')) %>% 
  ungroup()

为了简单起见,我现在可以为每个id占一行:

代码语言:javascript
运行
复制
# take one row for each test (so we aren't counting duplicates twice)
df <- distinct(df, across(c(id, contains('distinct'))))

现在,我想计算每个变量包含不一致响应的I的比例。我想做一些类似以下的事情:

代码语言:javascript
运行
复制
consistency <- df %>% 
  summarise(across(contains('distinct'), ~sum(.>1) / n(.)))

但这会给出以下错误,我很难解释它:

代码语言:javascript
运行
复制
Error: Problem with `summarise()` input `..1`.
x unused argument (.)
ℹ Input `..1` is `across(contains("distinct"), ~sum(. > 1)/n(.))`.

我可以通过执行以下操作来获得我想要的答案:

代码语言:javascript
运行
复制
# calculate consistency for each column by finding the number of distinct values greater 
# than 1 and dividing by total rows
# first get the number of distinct values
n_inconsistent <- df %>% 
  summarise(across(.cols = contains('distinct'), ~sum(.>1)))

# next get the number of rows
n_total <- nrow(df)

# calculate the proportion of tests that have more than one value for each column
consistency <- n_inconsistent %>% 
  mutate(across(contains('distinct'), ~./n_total))

但这涉及到中间变量,感觉很不雅致。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-06 11:51:01

您可以通过以下方式完成此操作:

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

df %>%
  group_by(id) %>%
  summarise(across(starts_with('col'), n_distinct)) %>%
  summarise(across(starts_with('col'), ~mean(. > 1), .names = '{col}_distinct'))

#  col1_distinct col2_distinct col3_distinct col4_distinct
#          <dbl>         <dbl>         <dbl>         <dbl>
#1             0          0.25          0.25           0.5

首先,我们计算每个id中每列中唯一值的数量,然后计算每列中大于1的值的比例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64708564

复制
相关文章

相似问题

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