使用动态列名称时提高R速度

如何解决使用动态列名称时提高R速度

我有一些可以按预期工作的代码,但是效率很低而且很慢。我有2个数据框-1)具有40,645行和264列,其中每一列代表某种KPI /维度; 2)具有478,872行和11列。 DF1是宽数据帧,DF2是长数据帧。我需要合并两者,但不能简单地合并列,因为数据框是不同的格式。另外,我需要合并DF2中的2列值以为DF1中的新列创建一个名称。最后,我使用循环来完成此任务,而执行此命令的工作实际上是在减慢代码速度:

DF1[[col_name_v]][index_v] <- col_val_v
# Additionally these other methods appears just as slow:
DF1[index_v,"col1"] <- col_val_v
DF1[index_v,265] <- col_val_v

如果我实际上是在哪里这样手动指定每个列名,它的工作速度会提高10倍以上:

DF1$col1[index_v] <- col_val1_v
DF1$col2[index_v] <- col_val2_v
DF1$col3[index_v] <- col_val3_v
#.... etc

问题是我需要代码是动态的,因为有很多列,并且这些列的名称可能会随时间而变化,所以我希望代码动态地学习列的名称并即时应用它们,以防止频繁添加和更改代码

数据如下所示: DF1(40645 * 264)-从下面的代码添加新列之前 Date_Time,YEAR,MON,DOW,WEEK,位置,ID,KPI1,KPI2,KPI3,...,KPI264 2020年9月7日,9月,星期一,36,33,33001,43,2,...,10

DF2(478872 * 11)-多行将作为多列合并到DF1 日期时间,位置,ID,技术,群集,维度,变量,公式,值,索引 9/7 / 2020,1,“整体”,“ NEWKPINAME1”,“总和(N)/总和(D)”,2.8,0.003 9/7 / 2020,1,“ LOCATION”,“ NEWKPINAME1”,“ SUM(N)/ SUM(D)”,2.8,0.004 9/7 / 2020,1,“ GROUP1”,“ NEWKPINAME1”,“ SUM(N)/ SUM(D)”,2.8,0.002

将维度+变量组合在一起以创建一个新的唯一KPI名称,以将其添加为列,并将该新列索引位置的索引值写入DF1。

# Provides the number of new columns that need to be added to DF1
dim_v <- unique(DF2$Dimension)
var_v <- unique(DF2$Variable)
limit_v <- length(dim_v) * length(var_v)

# This part adds the new columns to the DF1 - with NA set for values
index_v <- 1
while(index_v <= limit_v) {
  # Create the column name
  col_name_v <- paste(DF2$Dimension[index_v],DF2$Variable[index_v],sep="_")
  # Add the column name with default values of NA
  DF1[[col_name_v]] <- NA
  index_v <- index_v + 1
}

# This part writes the values of each DF2 Dimension_Variable KPI values stored in ROWS (12 per ID) to DF1 across 12 COLUMNS
# Merge the long DF2 ROW based KPIs into the wide DF1 COLUMN based KPIs
index_v <- 1
while(index_v <= nrow(DF1)) {
  # Identify the key fields we need for the lookup
  datetime_v <- as.Date(DF1$Date_Time[index_v])
  id_v <- DF1$ID[index_v]
  
  # Create a temp data.frame for the related data
  data_df <- subset(DF2,Date_Time == datetime_v & ID == id_v)
  
  # Do we even have records?
  if (nrow(data_df) !=0) {
    # cycle through and write each value
    index2_v <- 1
    while(index2_v <= nrow(data_df)) {
      # Create the column name
      col_name_v <- paste(data_df$Dimension[index2_v],data_df$Variable[index2_v],sep="_")
      col_val_v <- data_df$Index[index2_v]
      # Write the values related to the column name
      DF1[[col_name_v]][index_v] <- col_val_v
      index2_v <- index2_v + 1
    }
  } else {
    print(sprintf("No records for Date: %s ID: %s",datetime_v,id_v))
  }
  
  index_v <- index_v + 1
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?