4 表格问题,包括重复错误 R

4 Tabular questions including error with duplicates R

我有一个包含一组问卷答案的数据框

DAILY_QUESTIONS  <- c("Q1_Daily",  "Q2_Daily",   "Q3_Daily")

以及受访者的性别。这是一个说明我的数据的玩具数据集:

       UserId Days_From_First_Use    Sex Q1_Daily Q2_Daily Q3_Daily Region
1       A                   0 Female        3        2        1     US
2       A                   1 Female        1        0        0     US
3       A                   2 Female        1        1        0     US
4       A                   3 Female        0        2        0     US
5       A                   4 Female        1        1        1     US
6       B                   0   Male        4        8        2     CA
7       B                   2   Male        2        2        1     CA
8       B                   4   Male        5        6        5     CA
9       B                   5   Male        4        5        5     CA
10      C                   0 Female        5        7        2     UK
11      C                   1 Female        2        2        2     UK
12      C                   2 Female        5        5        4     UK
13      C                   3 Female        6        5        3     UK
14      C                   4 Female        6        6        4     UK
15      D                   0   Male        5        3        5     US
16      D                   1   Male        5        3        4     US
17      D                   2   Male        4        2        6     US
18      D                   3   Male        0        0        1     US
19      D                   4   Male        1        1        1     US

我使用命令

为此创建了一个表格摘要
 tabular((Sex + 1) ~ (n=1) + Format(digits=2)*(Q1_Daily + Q2_Daily + Q3_Daily)*(mean + sd), df_tmp)

并得到正确的输出:

               Q1_Daily     Q2_Daily     Q3_Daily    
 Sex    n  mean     sd  mean     sd  mean     sd 
 Female 10 3.0      2.3 3.1      2.4 1.7      1.6
 Male    9 3.3      1.9 3.3      2.5 3.3      2.1
 All    19 3.2      2.1 3.2      2.4 2.5      2.0

我现在有四个问题:

  1. 在我的真实数据框中,我没有 2 个,而是 21 个不同的问题,它们并不都采用 Q_Daily 的形式。我怎样才能避免写一个包含所有 21 个问题的字符串?我使用 my_questions <- c("Q1_Daily", "Q2_Daily", ...., "Grand_Total") 将它们收集到一个向量中。有没有办法将 my_questions 提供给表格表达式

  2. 如何转置 table 以便 headers 列为女性和男性,并且每个问题与两行相关联。输入 tranpose(tabular(..)) 或 dcast(melt(tablular(...))) 分别让我出现乱码和错误消息

  3. 我的真实数据框要大得多(而且我只展示了几行和 3 个问题)

    df_test

小标题:2,418 x 6

UserId 性别 Days_From_First_Use Q1_Daily Q2_Daily Q3_Daily 1 45ae06dd-37eb-492c-9a57-ca75d29d91f1 女 0 天 3 2 1 2 45ae06dd-37eb-492c-9a57-ca75d29d91f1 女 1 天 1 0 0 3 45ae06dd-37eb-492c-9a57-ca75d29d91f1 女 2 天 1 1 0 4 45ae06dd-37eb-492c-9a57-ca75d29d91f1 女 3 天 0 2 0 5 45ae06dd-37eb-492c-9a57-ca75d29d91f1 女 4 天 1 1 1 6 45ae06dd-37eb-492c-9a57-ca75d29d91f1 女 5 天 2 3 0 7 45ae06dd-37eb-492c-9a57-ca75d29d91f1 女 6 天 1 1 0 8 45ae06dd-37eb-492c-9a57-ca75d29d91f1 女 16 天 0 1 0 9 45ae06dd-37eb-492c-9a57-ca75d29d91f1 女 17 天 0 0 0 10 45ae06dd-37eb-492c-9a57-ca75d29d91f1 女 18 天 0 0 0

...还有 2,408 行

但是如果我尝试在上面使用相同的表格函数,我会收到一条错误消息:

tabular((Sex + 1) ~ (n=1) + Format(digits=2)*(Q1_Daily + Q2_Daily )*(mean + sd), as.data.frame(df_test))
Error in term2table(rows[[i]], cols[[j]], data, n) : 
  Duplicate values: Sex and Q1_Daily

我该如何解决这个问题?

  1. 最后,如何使用 openxlsx 将表格输出写入 Excel 工作簿,其 writeData 函数似乎只能与数据帧一起使用?尝试使用 as.data.frame 将表格 object 强制转换为数据框是行不通的。

对于这个冗长的问题深表歉意,非常感谢您的帮助

托马斯·飞利浦

我建议您使用基于 dplyr 的方法,因为它可以轻松处理大量问题。你的名字会改变,但结果是一样的。这里的代码:

library(dplyr)
#Functions
total <- function(x) {sum(!is.na(x))}
stats <- c('mean', 'sd', 'total')
#Code
new <- df %>% select(Sex,contains('Daily')) %>%
  group_by(Sex) %>% summarise_all(.funs = stats) %>%
  bind_rows(
    df %>% select(contains('Daily')) %>%
      summarise_all(.funs = stats) %>%
      mutate(Sex='Total')
  ) %>%
  rename(Myvar=Sex) %>%
  select(sort(current_vars()))

输出:

# A tibble: 3 x 10
  Myvar Q1_Daily_mean Q1_Daily_sd Q1_Daily_total Q2_Daily_mean Q2_Daily_sd
  <chr>         <dbl>       <dbl>          <int>         <dbl>       <dbl>
1 Fema~          3           2.31             10          3.1         2.42
2 Male           3.33        1.87              9          3.33        2.55
3 Total          3.16        2.06             19          3.21        2.42
# ... with 4 more variables: Q2_Daily_total <int>, Q3_Daily_mean <dbl>,
#   Q3_Daily_sd <dbl>, Q3_Daily_total <int>

使用了一些数据:

#Data
df <- structure(list(UserId = c("A", "A", "A", "A", "A", "B", "B", 
"B", "B", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D"), 
    Days_From_First_Use = c(0L, 1L, 2L, 3L, 4L, 0L, 2L, 4L, 5L, 
    0L, 1L, 2L, 3L, 4L, 0L, 1L, 2L, 3L, 4L), Sex = c("Female", 
    "Female", "Female", "Female", "Female", "Male", "Male", "Male", 
    "Male", "Female", "Female", "Female", "Female", "Female", 
    "Male", "Male", "Male", "Male", "Male"), Q1_Daily = c(3L, 
    1L, 1L, 0L, 1L, 4L, 2L, 5L, 4L, 5L, 2L, 5L, 6L, 6L, 5L, 5L, 
    4L, 0L, 1L), Q2_Daily = c(2L, 0L, 1L, 2L, 1L, 8L, 2L, 6L, 
    5L, 7L, 2L, 5L, 5L, 6L, 3L, 3L, 2L, 0L, 1L), Q3_Daily = c(1L, 
    0L, 0L, 0L, 1L, 2L, 1L, 5L, 5L, 2L, 2L, 4L, 3L, 4L, 5L, 4L, 
    6L, 1L, 1L), Region = c("US", "US", "US", "US", "US", "CA", 
    "CA", "CA", "CA", "UK", "UK", "UK", "UK", "UK", "US", "US", 
    "US", "US", "US")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19"))