首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多个变量的数据按单个变量分组

将多个变量的数据按单个变量分组
EN

Stack Overflow用户
提问于 2020-12-06 09:14:30
回答 2查看 214关注 0票数 1

在下面的数据集中,我想做两件事

代码语言:javascript
复制
pt_id <- c(1,1,1,1,1,2,2,2,3,3,3,3,3,4,4,4,4)
Tobacco <- c("once","twice","never", NA, NA, NA, NA, NA,"Once","Twice","Quit","Once",NA,NA,"Never", NA, "Never")
Alcohol <- c("twice", "once",NA, NA, "never", NA, NA, "Once", NA, "Quit", "Twice", NA, "Once", NA, NA, "Never", "Never")
PA <- c("once",NA,"never", NA, NA, NA, NA, NA,"Once",NA,"Quit","Once",NA,NA,"Never", NA, NA)
mydata <- data.frame(pt_id, Tobacco, Alcohol, PA)
mydata

  1. 计数每个病人的行数,而不是每个变量(烟草、酒精和PA)按病人ID.

分组的行数。

我使用了下面的代码来获得输出,但每次只能对一个变量进行输出。

代码语言:javascript
复制
mydata_tob <- mydata %>% 
  filter(!is.na(Tobacco)) %>% 
  group_by(pt_id) %>% 
  count()

# A tibble: 3 x 2
# Groups:   pt_id [3]
  pt_id     n
  <dbl> <int>
1     1     3
2     3     4
3     4     2

但这对我来说非常费时,因为我的原始数据集中有许多变量。我想对所有变量一次输出类似的输出。

  1. ,我的最终结果是,我想要为每个变量计算超过一个条目的pt_id的百分比。我创建了以下函数(仅用于烟草),以便能够这样做:

代码语言:javascript
复制
gt1_prop <- function(n) {
  gt1_len <- length(mydata_tob$n[mydata_tob$n > 1])
  len_tot <- length(mydata_tob$n)
  gt1_prop <- (gt1_len/ len_tot)*100
  return(gt1_prop)
}

同样,我想以一种方式进行编码,以获得数据集中每个变量(烟草、酒精和PA)的比例。

任何建议都会有帮助。提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-06 09:23:50

要计算每个pt_id的非NA值的数目,可以使用across

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

mydata %>%
  group_by(pt_id) %>%
  summarise(across(Tobacco:PA, ~sum(!is.na(.)))) -> result
result

#  pt_id Tobacco Alcohol    PA
#  <dbl>   <int>   <int> <int>
#1     1       3       3     2
#2     2       0       1     0
#3     3       4       3     3
#4     4       2       2     1

对于计算百分比的第二步,您可以:

代码语言:javascript
复制
result %>%
  summarise(across(Tobacco:PA, ~mean(. > 1) * 100))

#  Tobacco Alcohol    PA
#    <dbl>   <dbl> <dbl>
#1    0.75    0.75   0.5
票数 0
EN

Stack Overflow用户

发布于 2020-12-06 18:58:29

base R中,我们可以

代码语言:javascript
复制
aggregate(.~ pt_id, mydata, FUN = function(x) sum(!is.na(x)), na.action = NULL)

-output

代码语言:javascript
复制
#   pt_id Tobacco Alcohol PA
#1     1       3       3  2
#2     2       0       1  0
#3     3       4       3  3
#4     4       2       2  1

或者更简洁地使用来自base Rbase R

代码语言:javascript
复制
rowsum(+(!is.na(mydata[-1])), mydata$pt_id)
#  Tobacco Alcohol PA
#1       3       3  2
#2       0       1  0
#3       4       3  3
#4       2       2  1

如果我们需要百分比

代码语言:javascript
复制
colMeans(rowsum(+(!is.na(mydata[-1])), mydata$pt_id) > 1)
#Tobacco Alcohol      PA 
#   0.75    0.75    0.50 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65166418

复制
相关文章

相似问题

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