将数据重新排列到等高线图的矩阵中

恩索

我有此数据:

df = structure(list(vint1 = c(10L, 1L, 1L, 1L, 7L, 10L, 7L, 1L, 8L, 
3L, 7L, 9L, 1L, 5L, 5L), vint2 = c(3L, 4L, 4L, 1L, 3L, 4L, 6L, 
5L, 6L, 3L, 10L, 4L, 1L, 8L, 8L), vnum1 = c(-1.17289752533732, 
-0.559339864207054, -0.595443000061417, -0.396535659893954, 0.788141517690765, 
-0.655833840195406, -2.26371235489487, -1.34850886354386, -0.0218824069117636, 
0.554324892501117, 2.37117531121636, 0.248289029610446, -1.21942427707135, 
-1.4366686196659, -2.64837580107992)), .Names = c("vint1", "vint2", 
"vnum1"), class = "data.frame", row.names = c(NA, -15L))

当我在R提示符下给出以下命令时,它可以工作:

with(df[vint1==10 & vint2==3,], mean(vnum1))  

[1] -1.172898

但是下面的函数给出不正确的结果:

testfn = function(df2, a,b,c)
{
    with(df2[df2[[a]]==10 & df2[[b]]==3,], mean(df2[[c]]))
}

当我给出命令时:

testfn(df,1,2,3)

[1] -0.5571128

此值是第三列(vnum1)中所有条目的平均值

mean(df$vnum1)
[1] -0.5571128

以下功能也不起作用:

testfn = function(df2, name1,name2,name3)
{
    with(df2[name1==10 & name2==3,], mean(name3))
}

如果我使用:with(df2 [df2 $ name1 == 10&df $ name2 == 3,],mean(df2 $ name3))我得到了错误:参数不是数字或逻辑:返回NA

随后,我必须将该值分配给创建矩阵,该矩阵可用于创建轮廓图:

mycontour = function(df2, a,b,c)
{
    mymat = matrix(0,10,10)
    for(i in 1:10)   for(j in 1:10)
        mymat[i,j]= with(df2[df2[[a]]==i & df2[[b]]==j,], mean(df2[[c]]))
    filled.contour(mymat)
}  

这将创建一个轮廓图,以两个有序数(1:10)变量作为x和y轴,并根据第三个(数字)变量(对应于2个因子水平的值的均值)绘制轮廓。我该如何解决?谢谢你的帮助。

r2evans

在您的函数的第一个实例中,

testfn = function(df2, a,b,c)
{
    with(df2[df2[[a]]==10 & df2[[b]]==3,], mean(df2[[c]]))
}

with根本没有为您做任何事。您也可以使用:

testfn2 <- function(df2, a,b,c) {
    mean(df2[df2[[a]]==10 & df2[[b]]==3, c])
}
testfn2(df,1,2,3)
## [1] -1.172898

如果您希望在函数参数中使用名称,则需要做一些替代魔术。为此,我将很谦虚地向您介绍Hadley Wickham的“子集”页面,以进行详细说明。

要创建矩阵,再次使用您将with无济于事。试试这个:

mycontour2 <- function(df2, a,b,c) {
    nr <- 10 ; nc <- 10
    mm <- matrix(0, nr=nr, nc=nc)
    for (i in 1:nr)
        for (j in 1:nc)
            mm[i,j] <- mean(df2[df2[[a]]==i & df2[[b]]==j, c])
    mm[is.nan(mm)] <- 0
    mm
}
round(mycontour2(df, 1,2,3), digits=2)
##       [,1] [,2]  [,3]  [,4]  [,5]  [,6] [,7]  [,8] [,9] [,10]
##  [1,] -0.81    0  0.00 -0.58 -1.35  0.00    0  0.00    0  0.00
##  [2,]  0.00    0  0.00  0.00  0.00  0.00    0  0.00    0  0.00
##  [3,]  0.00    0  0.55  0.00  0.00  0.00    0  0.00    0  0.00
##  [4,]  0.00    0  0.00  0.00  0.00  0.00    0  0.00    0  0.00
##  [5,]  0.00    0  0.00  0.00  0.00  0.00    0 -2.04    0  0.00
##  [6,]  0.00    0  0.00  0.00  0.00  0.00    0  0.00    0  0.00
##  [7,]  0.00    0  0.79  0.00  0.00 -2.26    0  0.00    0  2.37
##  [8,]  0.00    0  0.00  0.00  0.00 -0.02    0  0.00    0  0.00
##  [9,]  0.00    0  0.00  0.25  0.00  0.00    0  0.00    0  0.00
## [10,]  0.00    0 -1.17 -0.66  0.00  0.00    0  0.00    0  0.00

另一种接近但不包含缺少索引的方法:

require(reshape2)
round(acast(df, vint1 ~ vint2, value.var='vnum1', fun.aggregate=mean, fill=0), digits=3)
##       1     3     4     5     6     8   10
## 1  -0.81  0.00 -0.58 -1.35  0.00  0.00 0.00
## 3   0.00  0.55  0.00  0.00  0.00  0.00 0.00
## 5   0.00  0.00  0.00  0.00  0.00 -2.04 0.00
## 7   0.00  0.79  0.00  0.00 -2.26  0.00 2.37
## 8   0.00  0.00  0.00  0.00 -0.02  0.00 0.00
## 9   0.00  0.00  0.25  0.00  0.00  0.00 0.00
## 10  0.00 -1.17 -0.66  0.00  0.00  0.00 0.00

请注意,第2列和第7列以及第2列,第4列和第6列都丢失了,在前一个矩阵中所有这些都为零。如果您有一个较大的数据集,而其中没有遗漏任何x或y值,那么这也许对您有用。(但是,有多种方法可以解决此问题,如果您需要使其更强大。那么,请大声一点。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章