R:当列位于赋值的左侧时,通过字符串变量标识表的列?

时间:2015-04-06 03:10:00

标签: r

我需要有一个函数来折叠列联表的某些列,如下所示:

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等的转换。

感谢您的帮助!

1 个答案:

答案 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在这种情况下很有用,但也许你不会总是需要/需要它们的一个子集。