该data.table软件包melt同时为多个列添加了一项新功能.这非常有用,但我无法弄清楚如何保留预熔融变量名称的"后缀".例如:
library(data.table)
# create data table
dt <- data.table(id = seq(3), a_3 = seq(3), a_4 = seq(4, 6), b_3 = seq(7, 9), b_4 = seq(10, 12))
# melt and cast in one step using new feature
m1 <- melt(dt, id.vars='id', measure=patterns("a_", "b_"), value.name=c("a_", "b_"))
Run Code Online (Sandbox Code Playgroud)
结果在数据表中:
id variable a_ b_
1: 1 1 1 7
2: 2 1 2 8
3: 3 1 3 9
4: 1 2 4 10
5: 2 2 5 11
6: 3 …Run Code Online (Sandbox Code Playgroud) 给定具有任意行数和列数的数据框或矩阵,将函数应用于所有成对列组合的最快方法是什么?
例如,如果我有一个数据表:
N <- 3
K <- 3
data <- data.table(id=seq(N))
for(k in seq(K)) {
data[[k]] <- runif(N)
}
Run Code Online (Sandbox Code Playgroud)
我想计算所有列对之间的简单差异,我可以lapply在列上循环(或):
differences = data.table(foo=seq(N))
for(var1 in names(data)) {
for(var2 in names(data)) {
if (var1==var2) next
if (which(names(data)==var1)>which(names(data)==var2)) next
combo <- paste0(var1, var2)
differences[[combo]] <- data[[var1]]-data[[var2]]
}
}
Run Code Online (Sandbox Code Playgroud)
但随着 K 变大,这变得异常缓慢。
我考虑过的一种解决方案是使用combn并减去它们来制作两个新数据表:
a <- data[,combn(colnames(data),2)[1,],with=F]
b <- data[,combn(colnames(data),2)[2,],with=F]
differences <- a-b
Run Code Online (Sandbox Code Playgroud)
但是随着 N 和 K 变大,这会变得非常占用内存(尽管比循环快)。
在我看来,矩阵与自身的外积可能是最好的方法,但我无法拼凑起来。如果我想应用任意函数(例如 RMSE),而不仅仅是差异,这尤其困难。
最快的方法是什么?
使用ggplot的geom_pointrange()功能,如何分别改变点的大小和线的粗细?
例:
# make test data
df <- data.frame(y=10, ymin=1, ymax=20, x=1)
# store ggplot object
p <- ggplot(data=df, aes(y=y, ymin=ymin, ymax=ymax, x=x))
# plot 1: big dot and thick line
p + geom_pointrange(fill='blue', color='grey', shape=21, size=5)
# plot 2: small dot and thin line (I want small dot and thick line or vice versa)
p + geom_pointrange(fill='blue', color='grey', shape=21, lwd=1, size=5)
Run Code Online (Sandbox Code Playgroud)
情节1:
情节2:
我可以得到一个粗线的小点(反之亦然)?
一种解决方法可能是使用geom_point和绘制线条和点作为单独的geoms geom_errorbar.不幸的是,我的实际应用程序涉及抖动,所以点和间隔最终在不同的地方(除非我可以控制抖动?).
我可以在SO上找到类似的问题(像这样),但他们并没有直接回答这个问题.
谢谢!