我试图使用lsa::cosine函数推导分布在数据帧连续行中的向量之间的余弦值.我的原始数据帧由15个数字列构成,每行表示一个唯一的向量

我的挑战是创建一个反映cosine(vec1, vec2)的新变量(例如cosineraw).Vec1是第1行的向量,Vec2是下一行(前导)的向量.我需要这个函数来为非常大的数据帧循环行,并试图避免for循环.本质上,我需要为每一行计算一个余弦值,与停在数据帧倒数第二行的下一行进行对比(因为最后一次观察没有余弦值).

我try 按行 Select 观察结果:

dat <- mydat %>% rowwise %>% mutate(cosraw = cosine(as.vector(t(select_all))), as.vector(t(lead(select_all))))

但是我得到了一个"参数不是矩阵"的错误

单独来看,此代码段可以工作:

问题是行索引必须是相对的.这只适用于行1和行2,而不是作为跨所有行滚动的函数的基础.

有没有办法避免"for"循环?

推荐答案

这是一个基本的R解决方案:

# Load {lsa}
library(lsa)

# Generate data with 250k rows and 300 columns
gen_list <- lapply(1:250000, function(i){
  rnorm(300)
})

# Convert to matrix
mat <- t(simplify2array(gen_list))

# Obtain desired values
vals <- unlist(
  lapply(
    2:nrow(mat), function(i){
      cosine(mat[i-1,], mat[i,])
    }
  )
)

您可以忽略gen_list代码,因为这是为了生成示例数据.

您需要将数据帧转换为矩阵,使其与{lsa}包兼容.

运行速度很快--在我的计算机上运行3.39秒

R相关问答推荐

使用map()内的公式()创建多个公式

根据固定值范围在tible中添加新行

从R中的另一个包扩展S3类的正确方法是什么

根据shiny 应用程序中的数字输入更改图标 colored颜色

如何按排序顺序打印一个框架中所有精确的唯一值?

在垂直轴中包含多个ggplot2图中的平均值

selectInput不返回ALL,并将因子转换为shiny 的数字

如何将dygraph调用到R Markdown作为一个shiny 的react 对象的参数?

为了网络分析目的,将数据框转换为长格式列联表

将一个字符串向量调整为与其他字符串向量完全相同的大小

将多个列值转换为二进制

仅在R中的数据集开始和结束时删除所有 Select 列的具有NA的行

在R中,如何将误差条放置在堆叠的每个条上?

在gggraph中显示来自不同数据帧的单个值

将工作目录子文件夹中的文件批量重命名为顺序

在具有多个响应变量的比例堆叠条形图上方添加总计

如何阻止围堵地理密度图?

生存时间序列的逻辑检验

如何在R中创建这些列?

动态统计函数在ShinyApp内部更改