我想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条来自不同数据集但完全相同的行。
这是我期望看到的:
答案 0 :(得分:3)
如上所述,使用c
作为对象名称并不是一个好主意。
此外,您的示例图形(截至撰写本文时)看起来像是第一个数据集的第一个两行的图表。我假设这不是你想要的,而是你想要用文字描述的东西。
所以,我的建议是使用mapply
函数,它允许将一个数据集中的不同行与其他数据集的不同行一起绘制。
首先,创建一个能够执行您想要执行的操作的功能(注意:您的c
在这里cc
而d
是dd
)。您将转到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")
从这里开始,你可以创建一个循环来在单独的图形中生成每一行。