我正在尝试使用ggplot2 R库在密度分布上绘制某些数据的中值。我想将中间值作为文本打印在密度图的顶部。
您将看到一个示例的意思(使用“钻石”默认数据框):
我正在打印三个项目:密度图本身,一条垂直线,显示每个切割的中位数价格,以及带有该值的文本标签。但是,正如您所看到的,中位数价格在“ y”轴上重叠(这种美感在geom_text()函数中是必需的)。
有没有办法为每个中间价格动态分配一个“ y”值,以便在不同的高度打印它们?例如,每个“切口”的最大密度值。
到目前为止,我已经知道了
# input dataframe
dia <- diamonds
# calculate mean values of each numerical variable:
library(plyr)
dia_me <- ddply(dia, .(cut), numcolwise(median))
ggplot(dia, aes(x=price, y=..density.., color = cut, fill = cut), legend=TRUE) +
labs(title="diamond price per cut") +
geom_density(alpha = 0.2) +
geom_vline(data=dia_me, aes(xintercept=price, colour=cut),
linetype="dashed", size=0.5) +
scale_x_log10() +
geom_text(data = dia_me, aes(label = price, y=1, x=price))
Run Code Online (Sandbox Code Playgroud)
(我为geom_text函数中的y美感分配了一个常量值,因为它是强制性的)
我试图根据前两列的值删除一个非常大的文件(~100,000 条记录)中的重复行,而不考虑它们的顺序,然后打印这些字段+其他列。
所以,从这个输入:
A B XX XX
A C XX XX
B A XX XX
B D XX XX
B E XX XX
C A XX XX
Run Code Online (Sandbox Code Playgroud)
我想要:
A B XX XX
A C XX XX
B D XX XX
B E XX XX
Run Code Online (Sandbox Code Playgroud)
(也就是说,我想删除“BA”和“CA”,因为它们已经以相反的顺序出现;我不关心下一列中的内容,但我也想打印它)
我的印象是使用 awk + 数组应该很容易做到这一点,但我无法提出解决方案。
到目前为止,我正在修补这个:
awk '
NR == FNR {
h[$1] = $2
next
}
$1 in h {
print h[$1],$2}' input.txt
Run Code Online (Sandbox Code Playgroud)
我将第二列存储在由第一个 (h) 索引的数组中,然后检查存储的数组中是否出现第一个字段。然后,打印该行。但是出了点问题,我没有输出。
我很抱歉,因为我的代码根本没有帮助,但我有点坚持这个。
你有什么想法?
非常感谢!