根据列中的“是”或“否”仅绘制选定的行

Posted

技术标签:

【中文标题】根据列中的“是”或“否”仅绘制选定的行【英文标题】:Plot only selected rows based on the "YES" or "NO" in the column 【发布时间】:2014-12-17 10:49:37 【问题描述】:

我想matplot 仅从数据框中选定的行。在这两个数据集中,您都可以找到充满“YES”或“NO”的列。我想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 前两行。下一个任务是打开 pdf 和 matplot 一页上 SAME GRAPH 上每个表的第一行以及下一页上的任何其他行。因此,在每个图表中,我们应该有 2 条线来自不同的数据集,但完全相同的行。

这就是我期望看到的:

【问题讨论】:

【参考方案1】:

如前所述,使用 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()

【讨论】:

【参考方案2】:

首先,我认为将您的第一个 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")

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

G

【讨论】:

它看起来不像我的,我将其作为预期输出添加到问题中。 现在可以了。我转置了rbind,现在看起来应该一样了。 你能帮我处理一下循环吗?【参考方案3】:

我可以帮助您解决问题的第一部分。要仅绘制 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),因此不存在强制 NAs 的问题。

恐怕我没有遵循您的第二个要求。您能否澄清一下,我可以尝试再次提供帮助,或者也许其他人会回答。

希望这会有所帮助。

【讨论】:

这只是来自同一图表上不同数据的 matploting 行。所以根据给定的例子。在同一张图上绘制df1 的第一行和df2 的第一行(一个图上有两条线),依此类推,用于所有YES 行。 你试过什么? matplot(df1y[1, ], df2y[1, ]) 是否会产生您对第一行的期望?如果是这样,我可以适当地编辑我的答案。 这就是我想要得到的 = 2 行,但问题是简单的代码不适用于我的数据。用给定的例子试试吧。 为什么“简单代码不适用于您的数据”?您能否让我知道您尝试了什么,以及您期望生成的图表是什么样子的一些说明?没有这些我会迷路,因为我不熟悉你的具体情况。 我添加了预期的输出。由于引入了 NA,它不起作用。

以上是关于根据列中的“是”或“否”仅绘制选定的行的主要内容,如果未能解决你的问题,请参考以下文章

如何查询仅出现特定列中具有最高值的行的行?

pandas:删除两列中具有相同索引的行中的重复值

如何绘制 2x2 混淆矩阵,其中行中的预测和列中的实际值?

绘制二维矩阵的行和列

仅绘制时间序列的选定点

有条件地显示具有匹配值的单元格的行中的值