Я изучаю R, поэтому извините, если мой вопрос звучит слишком просто. Вот функция, которую я написал для создания подтаблицы из таблицы. Я следую книге Нормана Матлоффа. Итак, мне снова жаль, если вы считаете, что есть более короткий способ сделать это. Я учусь прямо сейчас, поэтому более длинные методы помогут мне только подтвердить свое понимание R.
subtable <- function(tbl,subnames)
{
tblarray <- unclass(tbl)
dcargs <-list(tblarray)
ndims <- length(subnames) # number of dimensions
for(i in 1:ndims)
{
dcargs[[i+1]]<-subnames[[i]]
}
subarray <-do.call("[",dcargs) ###LINE1###
dims <-lapply (subnames,length)
subtbl<-array(subarray,dims,dimnames = subnames)
class(subtbl)<-"table"
return(subtbl)
}
Теперь, когда я вызываю функцию, используя:
ct<-read.table("ct.dat",header=T)
где кт.дат:
"Vote.for.X" "Voted.for.X.Last.Time"
"Yes" "Yes"
"Yes" "No"
"No" "No"
"Not Sure" "Yes"
"No" "No"
Сейчас я позвоню
cttable<-table(ct)
subtable(cttable,subnames<-list(Vote.for.X=c("No","Yes"), Voted.for.X.Last.Time=c("No","Yes"))
Я получил правильную подтаблицу. Однако я понятия не имею, что делает LINE1.
Я выполнил код построчно, чтобы посмотреть, что происходит. Вот что я получил после вызова цикла for:
> dcargs
[[1]]
Voted.for.X.Last.Time
Vote.for.X No Yes
No 2 0
Not Sure 0 1
Yes 1 1
[[2]]
[1] "No" "Yes"
[[3]]
[1] "No" "Yes"
Теперь я понимаю, что dcargs будет аргументом функции для "[". Кроме этого, я понятия не имею, что происходит с LINE 1. Я действительно застрял.
Любая помощь, пожалуйста?
do.call(`[`, dcargs)
переводится какtbl[c("No","Yes"), c("No", Yes")]
- person thelatemail   schedule 27.07.2016do.call(`[`, list(cttable, c("No","Yes"), c("No","Yes")) )
и`[`(cttable, c("No","Yes"), c("No","Yes"))
иcttable[c("No","Yes"), c("No","Yes")]
- person thelatemail   schedule 27.07.2016tbl
— исходный аргумент функции — он присваиваетсяtblarray
, который затем помещается вdcargs
. Так что, по сути, это все ещеtbl
. Подмножество таблицы/объекта всегда является первым аргументом функции`[`
. - person thelatemail   schedule 27.07.2016[
сначала ссылается на dcargs[[1]], который является не чем иным, как копией tbl. Затем dcargs[[2] и dcargs[[3]] извлекают соответствующую строку и столбец, используя подмножество. Я прав? Я был бы искренне признателен за ваши мысли. Я боролся с этим примером около 5 часов. - person watchtower   schedule 27.07.2016