2013-03-16 6 views
3

Пожалуйста, позвольте мне начать с предоставления синтетического набора данных, который показывает проблемы:Почему mapply повторяет один и тот же список несколько раз?

Do <- rep(c(0,2,4,6,8,10,15,20,30,40,45,50,55,60,65,70,80,85,90,92,94,96,98,100), each=16,times=16) 
Cl <- rep(c("K", "Y","M","C"), each= 384, times=4) 
In <- rep(c("A", "S"), each=3072) 
Sa <- rep(c(1,2), each=1536) 
Data <- rnorm(6144) 
DataFrame <- cbind.data.frame(Do,Cl,In,Sa,Data); head(DataFrame) 
rm(Do,Cl,In,Sa,Data) 
attach(DataFrame) 

Далее, я разделил объект «» DataFrame в несколько списков, чтобы избежать непредсказуемого утилизации. В принципе, я помещаю каждое подмножество данных в отдельный список, чтобы цикличность была предсказуемой и обеспечивала правильный вывод в моем симуляторе.

DFSplit <- split(DataFrame[ , "Data"], list(Do, Cl, In, Sa)) 

Объект 'DFSplit' имеет 384 списков

length(names(DFSplit)) 

Затем я создал функцию 'IdS', чтобы определить списки имен

ids <- function(Do, Cl, In, Sa){ 
    grep(paste("^" , Do, "\\.", 
       Cl, "\\.", 
       In, 
       "\\.", Sa,sep=""), 
     names(DFSplit), value = TRUE)} 

mapply(ids, Do, Cl, In, Sa, SIMPLIFY = FALSE) 

Я понимаю, что каждый из 'IdS' длина аргументов 6144. mapply производит 384 списка, каждый раз повторяется 16 раз. Как изменить функцию ids, чтобы mapply не повторял одно и то же имя 16 раз. В качестве уродливого и дорогостоящего решения я использовал уникальный; Мне нужно лучшее фундаментальное решение.

unique(mapply(ids, Do, Cl, In, Sa, SIMPLIFY = FALSE)) 

Я также создал функцию для работы с списками «DFSplit». Он имеет ту же проблему, что и предыдущая функция. Дело в том, что оно принимает предыдущую функцию как вход.

dG <- function(Do,Cl, In, Sa){ 
    dg <- 100* 
       (1-10^-(DFSplit[[ids(Do, Cl, In, Sa)]] - DFSplit[[ids(0, Cl, In, Sa)]]))/
       (1-10^-(DFSplit[[ids(100, Cl, In, Sa)]] - DFSplit[[ids(0, Cl, In, Sa)]])) - Do 
    dg} 

mapply(dG, Do, Cl, In, Sa, SIMPLIFY = FALSE) 

То, что я пытаюсь сделать, но безуспешно, если я могу сказать, чтобы применить функцию Д.Г. внутри каждого из 384 списков. Я признаю, что функция dG также нуждается в изменении, и я не знаю, как это сделать. Я хочу, чтобы ввод функции dG был именем 384 списков, каждый из которых содержал 16 номеров. Я хочу, чтобы выход был списком 384 с примененным dG.

Пожалуйста, не стесняйтесь предлагать другое решение. Важно то, что мне нужно применить функцию «dG» к набору данных.

+0

Что именно вы хотите достичь? Ваше решение выглядит довольно сложно ... –

+0

Привет, Пол, я работаю над этим в течение недели без успеха. Я пытаюсь применить функцию «dG» к моим данным: «DataFrame». К сожалению, я не был успешным, так как аргументы отличаются друг от друга, и переработка привела к неправильному вычислению. Поэтому я разделил файл на списки, определил имя каждого списка, а затем применил функцию dG. –

+0

Я не могу понять, что вы на самом деле пытаетесь выполнить из этого кода. Но я удивлен, что вы удивлены, что ваш результат имеет длину 6144. Каждый аргумент, который вы передаете функции 'dG', имеет длину 6144. – joran

ответ

4

Пожалуйста, обратите пристальное внимание на то, что вы даваяmapply Каждый объект имеет длину 6144.

> length(Do) 
    [1] 6144 
    > length(Cl) 
    [1] 6144 
    > length(In) 
    [1] 6144 
    > length(Sa) 
    [1] 6144 
    > 

Вы даете mapply6144 кортежи и просить его перебрать каждый.
Это дает вам список 6144 элементов.

Это именно то, что вы говорите это сделать


Кроме того, просто скопировать и вставить код дает список 6144 долго, каждый элемент, содержащий 16 элементы.

. 
    . 
    [[6141]] 
    [1] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.421085e-14 
    [12] 0.000000e+00 0.000000e+00 0.000000e+00 -1.421085e-14 0.000000e+00 

    [[6142]] 
    [1] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.421085e-14 
    [12] 0.000000e+00 0.000000e+00 0.000000e+00 -1.421085e-14 0.000000e+00 

    [[6143]] 
    [1] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.421085e-14 
    [12] 0.000000e+00 0.000000e+00 0.000000e+00 -1.421085e-14 0.000000e+00 

    [[6144]] 
    [1] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.421085e-14 
    [12] 0.000000e+00 0.000000e+00 0.000000e+00 -1.421085e-14 0.000000e+00 

Следовательно, не 6144 из 1 элемента, как вы описали.

Вы получили два очень полезных совета, одну форму @Arun и одну из @Paul Hiemstra.

Возможно, вы попытаетесь описать, что именно вы пытаетесь выполнить, и люди здесь могут вам помочь.Кроме того, пожалуйста, не забудьте оглянуться назад на свои предыдущие вопросы и проголосовать и поблагодарить тех, кто дал вам полезные ответы.

+1

Большое спасибо, Пол, вы правы, я изменил свое сообщение, чтобы точно настроить мой вопрос –

+2

Привет @RagyIsaac. чтобы быть совершенно честным, вам может быть лучше начать новый вопрос с нуля (вы можете связать его с этим, или еще лучше, просто удалить его). Попробуйте сформулировать его как: «(1) Это результат, который я хочу (2). Это то, с чего я начинаю с (3), это то, что я пробовал (4). Это проблема, с которой я столкнулся при попытке этого. (5, необязательно). Это другие идеи, которые я пробовал или хотел бы попробовать, но не могу понять. «Цель состоит в том, чтобы предоставить достаточно информации, чтобы другие могли помочь вам, не давая каждому домашнему заданию просто понять проблему , –

+1

Привет, Рикардо, я попытался удалить его, но не смог. Я повторно разместил его. Спасибо за вашу помощь. –

Смежные вопросы