【问题标题】:Why does mapply repeat the same list multiple times?为什么 mapply 多次重复同一个列表?
【发布时间】:2013-03-16 13:03:19
【问题描述】:

请让我从提供显示问题的合成数据集开始:

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 功能也需要修改,我不知道如何。我希望 dG 函数的输入是 384 个列表的名称,每个列表包含 16 个数字。我希望输出是应用了 dG 的 384 列表。

请随时一起提出不同的解决方案。重要的是我需要将“dG”函数应用于数据集。

【问题讨论】:

  • 你想要完成什么?您的解决方案看起来相当复杂...
  • 嗨,保罗,我已经为此工作了一周,但没有成功。我正在尝试将“dG”函数应用于我的数据:“DataFrame”。不幸的是,我没有成功,因为参数的长度不同并且回收产生了错误的计算。所以我将文件分成列表,识别每个列表的名称,然后应用函数 dG。
  • 我真的无法从这段代码中弄清楚你实际上想要完成什么。但令我惊讶的是,您对结果的长度为 6144 感到惊讶。您传递给函数 dG 的每个参数的长度为 6144。
  • 嗨 joran:让我只使用一个列表名称来逐个分解函数“dG”的第一部分:ids(2, "C", "A", 1)。这将产生一个包含 16 个成员的向量。如果我使用所有 384 个列表名称,我应该得到 384 个列表,每个列表都有一个包含 16 个成员的向量。是的,我的数据集包含 6144,但我使用的是 384 列表名称。
  • 一些一般性建议 - 停止使用 attach(),您在输入时节省的字符并不像您在尝试做的事情中失去的清晰度那么重要。

标签: r


【解决方案1】:

请仔细看看你在给予什么mapply 每个对象的长度为6144。

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

您正在提供 mapply 6144 元组并要求它遍历每个元组。
它会返回一个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

因此,不是您描述的 1 个元素中的 6144 个。

您收到了两条非常好的建议,一条来自@Arun,一条来自@Paul Hiemstra。

也许您可以尝试描述您正在尝试完成的任务,这里的人们可以更好地帮助您。另外,请不要忘记回顾您之前的问题并投票并感谢那些给您有用的答案的人。

【讨论】:

  • 非常感谢保罗,你是对的,我修改了我的帖子以微调我的问题
  • 嗨@RagyIsaac。老实说,您最好从头开始一个新问题(您可以链接回这个问题,或者更好的是,只需将其删除)。尝试将其表述为:“(1)这是我想要的结果(2)这是我开始的结果(3)这是我尝试过的(4)这是我在尝试时遇到的问题。 (5,可选)这些是我尝试过的其他想法,或者想尝试但不太清楚” 目标是提供足够的信息以便其他人可以帮助您,而不必为了理解问题而给每个人做作业.
  • 嗨,Ricardo,我试图删除它,但我不能。我确实重新发布了它。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2017-03-11
  • 2016-04-04
  • 1970-01-01
相关资源
最近更新 更多