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
我现在有四个问题:
在我的真实数据框中,我没有 2 个,而是 21 个不同的问题,它们并不都采用 Q_Daily 的形式。我怎样才能避免写一个包含所有 21 个问题的字符串?我使用 my_questions <- c("Q1_Daily", "Q2_Daily", ...., "Grand_Total")
将它们收集到一个向量中。有没有办法将 my_questions 提供给表格表达式
如何转置 table 以便 headers 列为女性和男性,并且每个问题与两行相关联。输入 tranpose(tabular(..)) 或 dcast(melt(tablular(...))) 分别让我出现乱码和错误消息
我的真实数据框要大得多(而且我只展示了几行和 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
我该如何解决这个问题?
- 最后,如何使用 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"))
我有一个包含一组问卷答案的数据框
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
我现在有四个问题:
在我的真实数据框中,我没有 2 个,而是 21 个不同的问题,它们并不都采用 Q_Daily 的形式。我怎样才能避免写一个包含所有 21 个问题的字符串?我使用
my_questions <- c("Q1_Daily", "Q2_Daily", ...., "Grand_Total")
将它们收集到一个向量中。有没有办法将 my_questions 提供给表格表达式如何转置 table 以便 headers 列为女性和男性,并且每个问题与两行相关联。输入 tranpose(tabular(..)) 或 dcast(melt(tablular(...))) 分别让我出现乱码和错误消息
我的真实数据框要大得多(而且我只展示了几行和 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
我该如何解决这个问题?
- 最后,如何使用 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"))