请让我首先提供显示问题的合成数据集:
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个数字。我希望输出为384列表并应用了dG。
请随时提出不同的解决方案。重要的是我需要将'dG'功能应用于数据集。
答案 0 :(得分:4)
请仔细查看您给予 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。
也许你可以尝试描述你想要实现的目标,这里的人们可以更好地帮助你。此外,请不要忘记回顾您之前的问题和投票,并感谢那些给你有用答案的人。