小编muf*_*974的帖子

R /从下三角元素的向量中创建对称矩阵

我提供了一些数据,以R形式处理矢量形式.这个大小为n(n + 1)/ 2的向量的元素应该在对称矩阵中重新排列.例:

n<-4
x<-seq(from=1,to=n*(n+1)/2) 
Run Code Online (Sandbox Code Playgroud)

获得什么是一种很好的方式

mat<- 1 2 3 4
      2 5 6 7
      3 6 8 9  
      4 7 9 10 
Run Code Online (Sandbox Code Playgroud)

r vector matrix

3
推荐指数
1
解决办法
1986
查看次数

Matlab中矢量/数组乘法的快速方法

我正在寻找一种快速而灵活的方法来在Matlab中计算以下内容而不使用循环:

c = 1:5;
A = reshape(1:5^3,5,5,5);
res= c(1)*A(:,:,1)+...+c(5)*A(:,:,5) 
Run Code Online (Sandbox Code Playgroud)

我认为,与之合作

sum(A,3) 
Run Code Online (Sandbox Code Playgroud)

只要我能够沿第三维执行乘法,这可能是一个很好的方法.一个解决方案(但有循环)将是:

val = zeros(length(c),length(c))
for i = 1:length(c)
    val = val+c(i)*A(:,:,i)
end
Run Code Online (Sandbox Code Playgroud)

我只是想知道这是否可以以更简单(更优雅)的方式完成,避免循环.

matlab vectorization multidimensional-array matrix-multiplication

3
推荐指数
1
解决办法
131
查看次数

在 mutate 中应用函数

我有一个包含时间戳的 data.table 对象(以午夜后的秒数衡量)。我的目标是运行一个函数,该函数为每一行返回观察前最大 $k$ 秒发生的观察次数。

require(data.table, dplyr, dtplyr)
set.seed(123)
DF  <- data.frame(Secs=cumsum(rexp(10000,1)))
setDT(DF)  
> DF
               Secs
1: 8.434573e-01
2: 1.420068e+00
3: 2.749122e+00
4: 2.780700e+00
5: 2.836911e+00
---             
 9996: 1.003014e+04
 9997: 1.003382e+04
 9998: 1.003384e+04
 9999: 1.003414e+04
10000: 1.003781e+04
Run Code Online (Sandbox Code Playgroud)

我想应用于每一行的功能是

nS<-function(Second,k=5) 
    max(1,nrow(DF%>%filter(Secs<Second & Secs>=Second-k)))
Run Code Online (Sandbox Code Playgroud)

获得我想要的东西的一种方法是使用apply,这需要很长时间。

 system.time(val <- apply(DF,1,nS))
   User      System verstrichen 
  20.56        0.03       20.66 

#Not working 
DF%>%mutate(nS=nS(Secs,100))%>%head()

# Also not working
library(lazyeval)
f = function(col1, new_col_name) {
    mutate_call = lazyeval::interp(~ nS(a), a = as.name(col1))
    DF%>%mutate_(.dots=setNames(list(mutate_call),new_col_name))
}
head(f('Secs', 'nS'))

DF%>%mutate(minTime=Secs-k)%>%head()
Run Code Online (Sandbox Code Playgroud)

难道不能通过使用 mutate 来实现这种方法吗?非常感谢你的帮助!

r dplyr

3
推荐指数
1
解决办法
8628
查看次数

带有多列和书签的 R xtable

我想将 data.frame 转换为具有多列的(booktab)乳胶表,但我无法创建将 放在\toprule表顶部的输出。使用了以下数据

dat <- structure(c(841.8, 804.4, 135.1, 106.2, 0.7025, 0.09645, 305.2, 
707.1, 449.3, 119.9, 0.7025, 0.09645), .Dim = c(2L, 6L), .Dimnames = list(
c("ev", "smooth"), c("Mean", "SD", "best", "Mean", "SD", 
"best")))

> dat    
    Mean    SD    best  Mean    SD    best
    ev     841.8 135.1 0.70250 305.2 449.3 0.70250
    smooth 804.4 106.2 0.09645 707.1 119.9 0.09645

addtorow <- list()
addtorow$pos <- list(-1)
addtorow$command <- '& \\multicolumn{3}{c}{Tab a}& \\multicolumn{3}{c}{Tab b}\\\\'

print(xtable(dat), add.to.row=addtorow, include.colnames=TRUE,booktabs=TRUE)
Run Code Online (Sandbox Code Playgroud)

输出看起来几乎正确,但\toprule位置错误。

\begin{table}[ht]
\centering
\begin{tabular}{rrrrrrr}
  & …
Run Code Online (Sandbox Code Playgroud)

latex r xtable

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