GVKun编程网logo

在大型 data.table 中替换 NA 的最快方法(datatable替换列数据)

6

此处将为大家介绍关于在大型data.table中替换NA的最快方法的详细内容,并且为您解答有关datatable替换列数据的相关问题,此外,我们还将为您介绍关于.net–如何处理System.Data

此处将为大家介绍关于在大型 data.table 中替换 NA 的最快方法的详细内容,并且为您解答有关datatable替换列数据的相关问题,此外,我们还将为您介绍关于.net – 如何处理System.Data.DataTableExtensions.CopyToDataTable()中的缺陷、.net 手动建DataTable 获取DataTable列名 修改DataTable 列的顺序、ASP.NET操作DataTable各种方法总结(给Datatable添加行列、DataTable选择排序等)、c# datarow [] 转换成 datatable, List 转 datatable的有用信息。

本文目录一览:

在大型 data.table 中替换 NA 的最快方法(datatable替换列数据)

在大型 data.table 中替换 NA 的最快方法(datatable替换列数据)

我有一个很大的data.table,其中有许多缺失值分散在它的
~200k 行和 200 列中。我想尽可能有效地将这些 NA 值重新编码为零。

我看到两个选项:
1:转换为 data.frame,并使用类似这样
的东西 2:某种很酷的 data.table 子设置命令

我会对类型 1 的相当有效的解决方案感到满意。转换为 data.frame 然后再转换回 data.table 不会花费太长时间。

答案1

小编典典

这是一个使用data.table运算符的解决方案:=,基于 Andrie 和 Ramnath
的答案。

require(data.table)  # v1.6.6require(gdata)       # v2.8.2set.seed(1)dt1 = create_dt(2e5, 200, 0.1)dim(dt1)[1] 200000    200    # more columns than Ramnath''s answer which had 5 not 200f_andrie = function(dt) remove_na(dt)f_gdata = function(dt, un = 0) gdata::NAToUnknown(dt, un)f_dowle = function(dt) {     # see EDIT later for more elegant solution  na.replace = function(v,value=0) { v[is.na(v)] = value; v }  for (i in names(dt))    eval(parse(text=paste("dt[,",i,":=na.replace(",i,")]")))}system.time(a_gdata = f_gdata(dt1))    user  system elapsed  18.805  12.301 134.985system.time(a_andrie = f_andrie(dt1))Error: cannot allocate vector of size 305.2 MbTiming stopped at: 14.541 7.764 68.285system.time(f_dowle(dt1))  user  system elapsed  7.452   4.144  19.590     # EDIT has faster than thisidentical(a_gdata, dt1)   [1] TRUE

请注意,f_dowle 通过引用更新了 dt1。如果需要本地副本,则需要显式调用该copy函数来制作整个数据集的本地副本。data.table
setkeykey<-并且:=不要写时复制。

接下来,让我们看看 f_dowle 把时间花在了哪里。

Rprof()f_dowle(dt1)Rprof(NULL)summaryRprof()$by.self                  self.time self.pct total.time total.pct"na.replace"           5.10    49.71       6.62     64.52"[.data.table"         2.48    24.17       9.86     96.10"is.na"                1.52    14.81       1.52     14.81"gc"                   0.22     2.14       0.22      2.14"unique"               0.14     1.36       0.16      1.56... snip ...

在那里,我将专注于na.replaceis.na,那里有一些矢量副本和矢量扫描。通过编写一个小的 na.replace C
函数可以很容易地消除这些问题,该函数NA通过向量中的引用进行更新。我认为这至少可以将 20 秒缩短一半。任何 R 包中都存在这样的功能吗?

失败的原因f_andrie可能是因为它复制了整个dt1,或者创建了一个与整个 一样大的逻辑矩阵dt1,几次。其他 2
种方法一次只处理一列(尽管我只是简要地看了一下NAToUnknown)。

编辑 (Ramnath 在评论中要求的更优雅的解决方案):

f_dowle2 = function(DT) {  for (i in names(DT))    DT[is.na(get(i)), (i):=0]}system.time(f_dowle2(dt1))  user  system elapsed  6.468   0.760   7.250   # faster, tooidentical(a_gdata, dt1)   [1] TRUE

我希望我一开始就这样做!

EDIT2 (一年多后,现在)

还有set(). 如果有很多列被循环通过,这可能会更快,因为它避免[,:=,]了循环调用的(小)开销。set是一个可循环的:=.
?set

f_dowle3 = function(DT) {  # either of the following for loops  # by name :  for (j in names(DT))    set(DT,which(is.na(DT[[j]])),j,0)  # or by number (slightly faster than by name) :  for (j in seq_len(ncol(DT)))    set(DT,which(is.na(DT[[j]])),j,0)}

.net – 如何处理System.Data.DataTableExtensions.CopyToDataTable()中的缺陷

.net – 如何处理System.Data.DataTableExtensions.CopyToDataTable()中的缺陷

嘿伙计们,所以我遇到了一些可能是Extension方法.copyToDataTable中的缺陷.

导入(在VB.NET中)System.Data.DataTableExtensions然后针对IEnumerable调用该方法使用此方法.如果要使用LINQ过滤数据表,然后在最后还原DataTable,则可以执行此操作.

即:

Imports System.Data.DaTarowExtensions
    Imports System.Data.DataTableExtensions

    Public Class SomeClass
            Private Shared Function GetData() As DataTable
                Dim Data As DataTable

                Data = LegacyADO.NETDBCall


                Data = Data.AsEnumerable.Where(Function(dr) dr.Field(Of Integer)("SomeField") = 5).copyToDataTable()


                Return Data

            End Function
    End Class

在上面的示例中,“WHERE”过滤可能不会返回任何结果.如果发生这种情况,copyToDataTable会抛出异常,因为没有DaTarows.

为什么?

正确的行为应该是返回一个Rows.Count = 0的DataTable.

任何人都可以想到一个干净的解决方法,这样调用copyToDataTable的人不必知道这个问题吗?

System.Data.DataTableExtensions是一个静态类,所以我无法覆盖行为….任何想法?我错过了什么吗?

干杯

更新:

我已将此问题提交给Connect.我仍然想要一些建议,但如果您同意我的意见,可以通过以上链接在Connect上投票

干杯

someDataTable.AsEnumerable().Where(r => r.Field<string>("SomeField") == "SomeValue").AsDataView().ToTable();

.AsDataView().ToTable()返回一个空表,其结构与someDataTable相同,如果现在有从.Where()返回的行

.net 手动建DataTable 获取DataTable列名 修改DataTable 列的顺序

.net 手动建DataTable 获取DataTable列名 修改DataTable 列的顺序

//创建 表
DataTable tables = new DataTable();
//添加 创建 列
//第一列
DataColumn cums = new DataColumn();
cums.ColumnName = "UserName";
cums.DataType = typeof(string);
tables.Columns.Add(cums);
cums = new DataColumn();
cums.ColumnName = "Age";
cums.DataType = typeof(string);
tables.Columns.Add(cums);
tables.Columns.Add("Address", typeof(string));  这种用的较多
tables.Columns["Address"].SetOrdinal(0);  //修改DataTable 列的顺序
string[] columnNames = GetColumnsByDataTable(tables);
string ss = columnNames[0];   
        /// <summary>
        /// 根据datatable获得列名
        /// </summary>
        /// <param name="dt">表对象</param>
        /// <returns>返回结果的数据列数组</returns>   
       public  string[] GetColumnsByDataTable(DataTable dt)
        {
            string[] strColumns = null;
            if (dt.Columns.Count > 0)
            {
                int columnNum = 0;
                columnNum = dt.Columns.Count;
                strColumns = new string[columnNum];
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    strColumns[i] = dt.Columns[i].ColumnName;
                }
            }
            return strColumns;
        }

ASP.NET操作DataTable各种方法总结(给Datatable添加行列、DataTable选择排序等)

ASP.NET操作DataTable各种方法总结(给Datatable添加行列、DataTable选择排序等)

本文转自:https://www.cnblogs.com/sntetwt/p/3496477.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
 
namespace Gzcms.Common
{
     public  class  CreateTable
     {
         public  static  DataTable getTable()
         {
             //1.创建 datatable 
             DataTable dt =  new  DataTable( "datatable" ); //可以给表创建一个名字,datatable 
             //2.给表加个列名: 
             dt.Columns.Add( "id" typeof (System.Int32)); //类型是可以变换的,比如System.Int32,System.Double.. 
             dt.Columns.Add( "title" typeof (System.String));
             //3.给表加行,内容: 
             DataRow row = dt.NewRow();
             row[ "id" ] = 1;
             row[ "title" ] =  "标题1" ;
             dt.Rows.Add(row); //这样就可以添加了 
             row = dt.NewRow();
             row[ "id" ] = 2;
             row[ "title" ] =  "标题2" ;
             dt.Rows.Add(row);
             return  dt;
             /*
             //4. 过滤表内容,,查找id为1的信息 
             DataRow[] arr = dt.Select("id=1");//返回的是一个数组 
             //5.将过滤的内容插入到另一个table中 
             DataTable dtnew = dt.Clone();//将表dt里的列信息复制到dtnew里,不是复制数据 
             foreach (DataRow row in arr)
             {
                 dtnew.Rows.Add(row);//把过滤好的信息加入到dtnew里 
             }
             dt.AcceptChanges();//添加好后,要记得刷新一下! 
 
             //6.给表排序 
             dt.DefaultView.Sort = "id desc";
             //7.删除数据 
             dt.Rows.Remove(row);//根据row行信息删除 
             dt.Rows.RemoveAt(index);//根据index索引删除 
             //8.修改dt 的列信息 
             row2[0].BeginEdit();
             row2[0]["status"] = 0;
             row2[0].EndEdit();
              */
         }
 
     }
}

 

c# datarow [] 转换成 datatable, List<T> 转 datatable

c# datarow [] 转换成 datatable, List 转 datatable

 

c# datarow [] 转换成 datatable, List<T> 转 datatable

DdataRow [] 转成 Datatable

private DataTable ToDataTable(DataRow[] rows)
        {
            if (rows == null || rows.Length == 0) return null;
            DataTable tmp = rows[0].Table.Clone(); // 复制DataRow的表结构
            foreach (DataRow row in rows)
            {

                tmp.ImportRow(row); // 将DataRow添加到DataTable中
            }
            return tmp;
        }

 

 List<T> 转 datatable

#region List<T> 转table
        public static DataTable ListToDataTable<T>(List<T> entitys)
        {
            //检查实体集合不能为空
            if (entitys == null || entitys.Count < 1)
            {
                throw new Exception("需转换的集合为空");
            }
            //取出第一个实体的所有Propertie
            Type entityType = entitys[0].GetType();
            PropertyInfo[] entityProperties = entityType.GetProperties();

            //生成DataTable的structure
            //生产代码中,应将生成的DataTable结构Cache起来,此处略
            DataTable dt = new DataTable();
            for (int i = 0; i < entityProperties.Length; i++)
            {
                //dt.Columns.Add(entityProperties[i].Name, entityProperties[i].PropertyType);
                dt.Columns.Add(entityProperties[i].Name);
            }
            //将所有entity添加到DataTable中
            foreach (object entity in entitys)
            {
                //检查所有的的实体都为同一类型
                if (entity.GetType() != entityType)
                {
                    throw new Exception("要转换的集合元素类型不一致");
                }
                object[] entityValues = new object[entityProperties.Length];
                for (int i = 0; i < entityProperties.Length; i++)
                {
                    entityValues[i] = entityProperties[i].GetValue(entity, null);
                }
                dt.Rows.Add(entityValues);
            }
            return dt;
        }
        #endregion

 

今天关于在大型 data.table 中替换 NA 的最快方法datatable替换列数据的讲解已经结束,谢谢您的阅读,如果想了解更多关于.net – 如何处理System.Data.DataTableExtensions.CopyToDataTable()中的缺陷、.net 手动建DataTable 获取DataTable列名 修改DataTable 列的顺序、ASP.NET操作DataTable各种方法总结(给Datatable添加行列、DataTable选择排序等)、c# datarow [] 转换成 datatable, List 转 datatable的相关知识,请在本站搜索。

本文标签: