R中按列列出的汇总数据

R中按列列出的汇总数据,r,summarize,R,Summarize,我有以下数据 pt_id <- c(1,1,1,1,1,2,2,2,3,3,3,3,3,4,4,4,4) Tob_pk <- c(2, 5, 7, 1, 8, 12, 14, 3, 6, 8, 10, 20, 13, 5, 4, 12, 10) Tobacco <- c("Once","Twice","Never", NA, NA, NA, NA, NA,"Once","Twice&quo

我有以下数据

pt_id <- c(1,1,1,1,1,2,2,2,3,3,3,3,3,4,4,4,4)
Tob_pk <- c(2, 5, 7, 1, 8, 12, 14, 3, 6, 8, 10, 20, 13, 5, 4, 12, 10)
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, Tob_pk, Tobacco, Alcohol, PA)
mydata
我不确定我会错在哪里。如果我能得到任何建议,以获得以下输出,但也有NA的百分比,这将是很有帮助的

Tobacco                   Alcohol                        PA

Never    0.3333333      Never    0.3333333       Never    0.3333333  
Once     0.3333333      Once     0.3333333       Once     0.5000000
Quit     0.1111111      Quit     0.1111111       Quit.    0.1666667
Twice    0.2222222      Twice    0.2222222 
提前谢谢

使用base

pt_id 3 0.3333333 0.5000000 0.1666667 NA 2018年1月1日由v0.3.0使用基础创建

pt_id 3 0.3333333 0.5000000 0.1666667 NA 2018年1月1日由v0.3.0使用dplyr创建:

library(tidyverse)

df <- mydata %>%
  select(3:5) %>%
  gather('Your_vice', 'freq', 1:3) %>%
  group_by(Your_vice, freq) %>%
  summarize(n = n()) %>%
  mutate(perc = n/sum(n))

df

# A tibble: 14 x 4
# Groups:   Your_vice [3]
   Your_vice freq      n   perc
   <chr>     <chr> <int>  <dbl>
 1 Alcohol   Never     3 0.176 
 2 Alcohol   Once      3 0.176 
 3 Alcohol   Quit      1 0.0588
 4 Alcohol   Twice     2 0.118 
 5 Alcohol   NA        8 0.471 
 6 PA        Never     2 0.118 
 7 PA        Once      3 0.176 
 8 PA        Quit      1 0.0588
 9 PA        NA       11 0.647 
10 Tobacco   Never     3 0.176 
11 Tobacco   Once      3 0.176 
12 Tobacco   Quit      1 0.0588
13 Tobacco   Twice     2 0.118 
14 Tobacco   NA        8 0.471 
使用dplyr:

library(tidyverse)

df <- mydata %>%
  select(3:5) %>%
  gather('Your_vice', 'freq', 1:3) %>%
  group_by(Your_vice, freq) %>%
  summarize(n = n()) %>%
  mutate(perc = n/sum(n))

df

# A tibble: 14 x 4
# Groups:   Your_vice [3]
   Your_vice freq      n   perc
   <chr>     <chr> <int>  <dbl>
 1 Alcohol   Never     3 0.176 
 2 Alcohol   Once      3 0.176 
 3 Alcohol   Quit      1 0.0588
 4 Alcohol   Twice     2 0.118 
 5 Alcohol   NA        8 0.471 
 6 PA        Never     2 0.118 
 7 PA        Once      3 0.176 
 8 PA        Quit      1 0.0588
 9 PA        NA       11 0.647 
10 Tobacco   Never     3 0.176 
11 Tobacco   Once      3 0.176 
12 Tobacco   Quit      1 0.0588
13 Tobacco   Twice     2 0.118 
14 Tobacco   NA        8 0.471 

您可以将变量转换为具有相应级别的因子。然后,带有选项useNA=ifany的表格显示NA


您可以将变量转换为具有相应级别的因子。然后,带有选项useNA=ifany的表格显示NA


下面是一个使用prop.table+table+na.omit+factor的基本R选项

        Tobacco   Alcohol        PA
Once  0.3333333 0.3333333 0.5000000
Twice 0.2222222 0.2222222 0.0000000
Never 0.3333333 0.3333333 0.3333333
Quit  0.1111111 0.1111111 0.1666667

下面是一个使用prop.table+table+na.omit+factor的基本R选项

        Tobacco   Alcohol        PA
Once  0.3333333 0.3333333 0.5000000
Twice 0.2222222 0.2222222 0.0000000
Never 0.3333333 0.3333333 0.3333333
Quit  0.1111111 0.1111111 0.1666667

谢谢你的帮助!在我的原始数据集中,我几乎有35个变量/列,其中一些是dbl变量,而不是字符变量。是否有一种方法可以跳过代码中带有dbl变量的列,而不必手动选择一个范围,例如3:5和8:5?我们可以将base R代码的输出导出到excel文件中吗?请像下面这样尝试:map\u dfr.x=selectmydata,whereis.character,.f=prop.tabletable.xforbase cols\u char谢谢您的帮助!在我的原始数据集中,我几乎有35个变量/列,其中一些是dbl变量,而不是字符变量。是否有一种方法可以跳过代码中带有dbl变量的列,而不必手动选择一个范围,例如3:5,然后是8:5?我们可以将基本R代码的输出导出到excel文件中吗?请像下面这样尝试:map\u dfr.x=selectmydata,whereis.character,.f=prop.tabletable.xforbase cols\u char可以将输出导出到excel文件中吗?我试着使用write.xlsxres2,file=myDATA.xlsx,sheetName=res2,col.names=TRUE,row.names=TRUE,append=FALSE,但它不起作用!是否可以将输出导出到excel文件?我试着使用write.xlsxres2,file=myDATA.xlsx,sheetName=res2,col.names=TRUE,row.names=TRUE,append=FALSE,但它不起作用!
do.call(
  cbind,
  lapply(
    mydata[3:5],
    function(x) {
      prop.table(
        table(
          na.omit(
            factor(x, levels = unique(na.omit(unlist(mydata[3:5]))))
          )
        )
      )
    }
  )
)
        Tobacco   Alcohol        PA
Once  0.3333333 0.3333333 0.5000000
Twice 0.2222222 0.2222222 0.0000000
Never 0.3333333 0.3333333 0.3333333
Quit  0.1111111 0.1111111 0.1666667