R中的Null data.table和空data.table之间有区别吗?

时间:2015-08-05 15:45:07

标签: r data.table

小例子:

library(data.table)
l <- list(data.table(a=c("a", "b", "c"), b=c(1, 2, 3)),
          data.table(),
          data.table(d=c("x", "y", "z"), e=c(9, 8, 7))
     )    

> l
[[1]]
   a b
1: a 1
2: b 2
3: c 3

[[2]]
Null data.table (0 rows and 0 cols)

[[3]]
   d e
1: x 9
2: y 8
3: z 7

在制作中,我有这个清单:

[[3]]
                 rn blogs news twitter count qmle
1: almost feel like     1    1       1     3  0.5

[[4]]
Empty data.table (0 rows) of 5 cols: rn,blogs,news,twitter,count

l[[2]]与生产中的[[3]]相同吗?

另外,我想压缩列表,这样只保留data.tables,它们分别不是NULL或空。我该怎么做?

我尝试使用Filter,但空数据表仍保留在列表中。

> Filter(length, x[386:390])
[[1]]
Empty data.table (0 rows) of 5 cols: rn,blogs,news,twitter,count

[[2]]
                       rn blogs news twitter count       qmle
1:       almost every day    12    2       1    15 0.25423729
2: almost everything else     2    2       1     5 0.08474576

[[3]]
                       rn blogs news twitter count qmle
1: almost everything else     2    2       1     5  0.5

[[4]]
                 rn blogs news twitter count qmle
1: almost feel like     1    1       1     3  0.5

[[5]]
Empty data.table (0 rows) of 5 cols: rn,blogs,news,twitter,count

1 个答案:

答案 0 :(得分:2)

您可以使用nrow过滤列表元素并使用NULL。这应该适用于empty以及length data.table。在第一种情况下,我建议str(l[[4]]),但如果我们查看length,它仍然有五列,每行0行。因此,ncol会给length ie。 5我们在Filter中使用nrow时也会包含它。然而,empty为NULL,0Filter。在 Filter(nrow, l) #[[1]] # a b #1: a 1 #2: b 2 #3: c 3 #[[2]] # d e #1: x 9 #2: y 8 #3: z 7 内,0将被强制为'FALSE'而其他所有内容将被强制为'TRUE'。

 l[[4]] <- as.data.table(matrix(, ncol=5, nrow=0))

数据

    using MbnApi;
    using System;

    namespace GetSmsStatusTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                GetSmsStatus(args[0]);
            }

            static void GetSmsStatus(string interfaceID)
            {
                try
                {
                    MbnInterfaceManager mbnInfMgr = new MbnInterfaceManager();
                    IMbnInterfaceManager infManager = (IMbnInterfaceManager)mbnInfMgr;

                    //obtain the IMbnInterface passing interfaceID
                    IMbnInterface mbnInterface = infManager.GetInterface(interfaceID);
                    IMbnSms mbnSms = mbnInterface as IMbnSms;
                    if (mbnSms == null)
                    {
                        Console.WriteLine("Got no IMbnSms");
                        return;
                    }
                    MBN_SMS_STATUS_INFO mbnSmsStatusInfo;
                    mbnSms.GetSmsStatus(out mbnSmsStatusInfo);
                    Console.WriteLine("flag={0}, index={1}", mbnSmsStatusInfo.flag, mbnSmsStatusInfo.messageIndex);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }   
            }
    }