根据值

时间:2015-10-23 23:25:37

标签: r plot

我创建了一个情节,我想在其中为代码值着色。值的一个子集将是一种颜色,另一个子集是不同的颜色,剩余值是另一种颜色。

子集的工作方式如下: 我已根据一列对数据框进行了排序。我已经为最后10个值和前10个值创建了一个子集。我想对NY列的值进行颜色编码,对应于Total列中的前10个或后10个值。所以我的NY值不会被排序,但它们将与Total中的那些排序值相对应。

唯一的问题是,NY列中存在重复的某些值,这些值不在前10或下10中。例如:5位于底部10子集内。但是还有另一个5的实例,而不是在底部10中。

因此,我的代码颜色不是仅对底部10进行颜色编码,而是对底部10中这些值的所有实例进行编码。例如,12或13个值是彩色的而不是10个。

我可能在我的plot()调用中有更多的代码然后我实际需要,但除了我面临的这个问题之外它对我有用:

upper10<-tail(statedata[order(Total),],10)
lower10<-head(statedata[order(Total),],10)

plot(State,NY,type="p",pch=ifelse(NY %in% lower10$NY,
           0, ifelse(NY %in% upper10$NY, 1, 2)),
            col=ifelse(NY %in% lower10$NY,
           "green3", ifelse(NY %in% upper10$NY, "red", "black")),
            main="New York")

基本上,我尝试做的是确保只有底部10个值为绿色。此代码将整个数据框中这些值的所有实例更改为绿色,因为存在重复项。所以现在我被卡住了。

如果这令人困惑,请道歉。如果它太混乱,我可以尝试进一步澄清。

编辑:添加了一些数据:

DET  NY  CHI  Total
2.6  9.3 23.0 15.8
5.0  6.3 25.3 32.1 
5.9  5.0 31.5 18.4
7.1 11.9 18.7 13.8
7.5 11.8 17.3  3.0
4.1  1.0 10.7  8.0
10.1 48.8 4.7 45.0

这只是一个片段。我对Total进行了排序,然后根据排序的lower10或upper10中的值,对NY中的值进行颜色编码。

1 个答案:

答案 0 :(得分:1)

我确信有更多有效的方法可以实现这一目标;在没有实质性更改主代码的情况下执行此操作的一种方法是尝试使用ifelse函数内plot语句中的索引。我略微更改了数据框和子集,以生成快速且脏的可重现示例。

该脚本与原始代码几乎相同,只是它试图通过交叉检查lower5upper5子集中的相应索引来找到匹配项。这可以使用rownames函数完成,如下所示。

运行它,让我知道这是否是您正在寻找的,如果您需要进一步澄清。

#Define a dataframe for demonstration purposes
df <- data.frame(DET=1:20,NY=21:40,CHI=41:60,Total=100:81)

#Subset the lower and upper 5 values after sorting the dataframe (df) by the Total column
lower5 <- tail(df[order(df$Total),],5)
upper5 <- head(df[order(df$Total),],5)


#Plot the NY column from df and color code the data points if the indices in the NY column matches those of lower5 and upper5 subsets
plot(df$NY,
     type="p",
     pch=ifelse(rownames(df) %in% rownames(lower5),0, ifelse(rownames(df) %in% rownames(upper5), 1, 2)),
     col=ifelse(rownames(df) %in% rownames(lower5),'green3', ifelse(rownames(df) %in% rownames(upper5), 'red', 'black')),
     main="New York")