仅根据" YES"绘制选定的行。或"否"在专栏中

时间:2014-12-17 10:49:38

标签: r

我想matplot只选择数据框中的行。在这两个数据集中,您可以找到满为" YES"的列。或"否"。我想matplot只在最后一列中有YES的行(当然是带有值的列)。让我先向您展示数据,然后再给出一些我期望实现的解释。

> dput(c)
structure(list(Fr1 = c(0.2, 0, 0, 0, 0, 0), Fr2 = c(0.7, 0, 0, 
0, 0, 0), Fr3 = c(1, 0.35, 0, 0, 0, 0), Fr4 = c(0.1, 1, 0, 0, 
0.5, 0), Fr5 = c(0, 0.4, 0, 0, 1, 0), Fr6 = c(0, 0, 0, 0, 0.3, 
0), Fr7 = c(0, 0, 0, 0.7, 0, 0), Fr8 = c(0, 0, 0, 1, 0, 0), Fr9 = c(0, 
0, 0, 1, 0, 0), Fr10 = c(0, 0, 0, 0.65, 0, 0.7), Fr11 = c(0, 
0, 0, 0.2, 0, 1), w = structure(c(2L, 2L, 1L, 1L, 1L, 1L), .Label = c("NO", 
"YES"), class = "factor")), .Names = c("Fr1", "Fr2", "Fr3", "Fr4", 
"Fr5", "Fr6", "Fr7", "Fr8", "Fr9", "Fr10", "Fr11", "w"), row.names = c("Mazda RX4", 
"Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", "Hornet Sportabout", 
"Valiant"), class = "data.frame")


> dput(d)
structure(list(Fr1 = c(1, 0, 0, 0, 0, 0), Fr2 = c(0.7, 0, 0, 
0, 0, 0), Fr3 = c(0.2, 0, 0, 0, 0, 0), Fr4 = c(0.1, 0, 0, 0, 
0.5, 0), Fr5 = c(0, 0.1, 0, 0, 1, 0), Fr6 = c(0, 0, 0, 0, 0.3, 
0), Fr7 = c(0, 0.8, 0, 0.7, 0, 0), Fr8 = c(0, 1, 0, 1, 0, 0), 
    Fr9 = c(0, 0.3, 0, 1, 0, 0), Fr10 = c(0, 0, 0, 0.65, 0, 0.7
    ), Fr11 = c(0, 0, 0, 0.2, 0, 1), w = structure(c(2L, 2L, 
    1L, 1L, 1L, 1L), .Label = c("NO", "YES"), class = "factor")), .Names = c("Fr1", 
"Fr2", "Fr3", "Fr4", "Fr5", "Fr6", "Fr7", "Fr8", "Fr9", "Fr10", 
"Fr11", "w"), row.names = c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710", 
"Hornet 4 Drive", "Hornet Sportabout", "Valiant"), class = "data.frame")

那些表格如何:

                  Fr1 Fr2  Fr3 Fr4 Fr5 Fr6 Fr7 Fr8 Fr9 Fr10 Fr11   w
Mazda RX4         0.2 0.7 1.00 0.1 0.0 0.0 0.0   0   0 0.00  0.0 YES
Mazda RX4 Wag     0.0 0.0 0.35 1.0 0.4 0.0 0.0   0   0 0.00  0.0 YES
Datsun 710        0.0 0.0 0.00 0.0 0.0 0.0 0.0   0   0 0.00  0.0  NO
Hornet 4 Drive    0.0 0.0 0.00 0.0 0.0 0.0 0.7   1   1 0.65  0.2  NO
Hornet Sportabout 0.0 0.0 0.00 0.5 1.0 0.3 0.0   0   0 0.00  0.0  NO
Valiant           0.0 0.0 0.00 0.0 0.0 0.0 0.0   0   0 0.70  1.0  NO

                  Fr1 Fr2 Fr3 Fr4 Fr5 Fr6 Fr7 Fr8 Fr9 Fr10 Fr11   w
Mazda RX4           1 0.7 0.2 0.1 0.0 0.0 0.0   0 0.0 0.00  0.0 YES
Mazda RX4 Wag       0 0.0 0.0 0.0 0.1 0.0 0.8   1 0.3 0.00  0.0 YES
Datsun 710          0 0.0 0.0 0.0 0.0 0.0 0.0   0 0.0 0.00  0.0  NO
Hornet 4 Drive      0 0.0 0.0 0.0 0.0 0.0 0.7   1 1.0 0.65  0.2  NO
Hornet Sportabout   0 0.0 0.0 0.5 1.0 0.3 0.0   0 0.0 0.00  0.0  NO
Valiant             0 0.0 0.0 0.0 0.0 0.0 0.0   0 0.0 0.70  1.0  NO

如你所见,我只想matplot前两行。下一个任务是在一页上的SAME GRAPH上的每个表和下一页上的任何其他行打开pdf和matplot第一行。因此,在每个图形中,我们应该有2条来自不同数据集但完全相同的行。

这是我期望看到的: Output

3 个答案:

答案 0 :(得分:3)

如上所述,使用c作为对象名称并不是一个好主意。

此外,您的示例图形(截至撰写本文时)看起来像是第一个数据集的第一个两行的图表。我假设这不是你想要的,而是你想要用文字描述的东西。

所以,我的建议是使用mapply函数,它允许将一个数据集中的不同行与其他数据集的不同行一起绘制。

首先,创建一个能够执行您想要执行的操作的功能(注意:您的c在这里ccddd)。您将转到mapply函数:

# xx is the row of cc you'd like to plot
# yy is the row of dd you'd like to plot
myfun <- function(xx, yy) {
    subCC <- cc[xx, -ncol(cc)]
    subDD <- dd[yy, -ncol(dd)]
    dat <- t(rbind(subCC, subDD))
    matplot(dat, type = "l", lty = c(2, 5), ylab = "Intensity",
        xlab = "Fraction size")
}

然后获取您想要绘制的数据集的行索引

ccYes <- which(cc[, ncol(cc)] %in% "YES")
ddYes <- which(dd[, ncol(dd)] %in% "YES")

然后创建一个包含多个页面的pdf,将上面的函数和行索引传递给mapply

pdf("lines.pdf")
mapply(myfun, ccYes, ddYes)
dev.off()

答案 1 :(得分:1)

我可以帮助您解决问题的第一部分。要仅绘制w = YES的行,只需使用R的子集化​​功能来创建新对象:

df1y <- df1[which(df1$w == "YES"), 1:(ncol(df1) - 1)]
df2y <- df2[which(df2$w == "YES"), 1:(ncol(df2) - 1)]

df1是第一个dput输出,df2是上面提供的第二个dput输出。这会将w = YES和所有列的行分配给新对象df1y / df2y并删除最后一列(w),这样就不存在强制问题{ {1}}秒。

我担心我不遵循你的第二个请求。你可以澄清一下,我可以再次尝试帮助,或者也许其他人会回答。

希望这有帮助。

答案 2 :(得分:1)

首先,我认为最好将你的第一个df命名为c,因为它已经是一个R函数。

其次,您可以根据@Phil建议对您的df进行子集化。一旦你有了这个,我认为你在尝试matplot(df1y[1,],df2y[1,])时遇到了错误,原因有以下几点:首先,你留下了最后一列的因子(是/否),并通过强制迫使NAs。其次,我想你需要rbind来正确显示你想要的东西,所以:

matplot(t(rbind(df1y[1,1:11],df2y[1,1:11])),type="l")

从这里开始,你可以创建一个循环来在单独的图形中生成每一行。