小编dmp*_*dmp的帖子

使用模式融合和转换数据表

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)

r data.table

7
推荐指数
1
解决办法
613
查看次数

将函数应用于所有列的成对组合的最快方法

给定具有任意行数和列数的数据框或矩阵,将函数应用于所有成对列组合的最快方法是什么?

例如,如果我有一个数据表:

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),而不仅仅是差异,这尤其困难。

最快的方法是什么?

r data.table

6
推荐指数
1
解决办法
2104
查看次数

ggplot中geom_pointrange中点和线的大小分开

使用ggplotgeom_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上找到类似的问题(像这样),但他们并没有直接回答这个问题.

谢谢!

r ggplot2

6
推荐指数
1
解决办法
4602
查看次数

标签 统计

r ×3

data.table ×2

ggplot2 ×1