我需要有一个函数来折叠列联表的某些列,如下所示:
collapse.a.column <-function(tb, a.column, collapse.list) {
return(collapse.table(tb, <something_to_identify_a.column> = collapse.list))
}
a.column
是一个字符串。
我很难在作业a.column
=
这似乎是在赋值左侧表达列的一般要求,如data.frame等的转换。
感谢您的帮助!
答案 0 :(得分:1)
这可能是do.call
以下是?vcdExtra::collapse.table
library('vcdExtra')
# create some sample data in table form
set.seed(1)
sex <- c("Male", "Female")
age <- letters[1:6]
education <- c("low", 'med', 'high')
data <- expand.grid(sex=sex, age=age, education=education)
counts <- rpois(36, 100)
data <- cbind(data, counts)
t1 <- xtabs(counts ~ sex + age + education, data=data)
structable(t1)
# age a b c d e f
# sex education
# Male low 93 112 84 107 96 93
# med 99 109 105 107 80 110
# high 95 98 99 109 111 98
# Female low 113 104 104 105 92 97
# med 99 108 109 100 105 93
# high 97 103 86 95 107 97
# collapse age to 3 levels
t2 <- collapse.table(t1, age=c("A", "A", "B", "B", "C", "C"))
structable(t2)
# age A B C
# sex education
# Male low 205 191 189
# med 208 212 190
# high 193 208 209
# Female low 217 209 189
# med 207 209 198
# high 200 181 204
使用do.call
,您会得到相同的结果
t3 <- do.call('collapse.table', list(table = t1,
age = c("A", "A", "B", "B", "C", "C")))
structable(t3)
# age A B C
# sex education
# Male low 205 191 189
# med 208 212 190
# high 193 208 209
# Female low 217 209 189
# med 207 209 198
# high 200 181 204
这样你的功能可能看起来像
collapse.a.column <- function(table = t1, ...) {
do.call('collapse.table', c(list(table = t1, ...)))
}
t4 <- collapse.a.column(age = c("A", "A", "B", "B", "C", "C"))
structable(t4)
# age A B C
# sex education
# Male low 205 191 189
# med 208 212 190
# high 193 208 209
# Female low 217 209 189
# med 207 209 198
# high 200 181 204
由于collapse.table
有参数(table, ...)
,你可以想到它,因为你有一个函数可以接受任何东西作为参数,有些你想要给,有些你不给。当你想要将一个参数列表传递给一个函数时,do.call
在这种情况下很有用,但也许你不会总是需要/需要它们的一个子集。