R 在'中新增列;j';data.table的值应在范围内可用

R 在'中新增列;j';data.table的值应在范围内可用,r,data.table,R,Data.table,我有以下代码: dat<-dat[,list(colA,colB ,RelativeIncome=Income/.SD[Nation=="America",Income] ,RelativeIncomeLog2=log2(Income)-log2(.SD[Nation=="America",Income])) #Read 1) ,by=list(Name,Nation)] 您

我有以下代码:

dat<-dat[,list(colA,colB
                     ,RelativeIncome=Income/.SD[Nation=="America",Income]
                     ,RelativeIncomeLog2=log2(Income)-log2(.SD[Nation=="America",Income])) #Read 1)
               ,by=list(Name,Nation)]

您可以在
j
中创建和分配对象,只需使用
{
大括号
}

然后,您可以将这些对象(或对象的函数和计算)从
j
中传递出来,并将它们指定为data.table的列。要一次分配多个列,只需执行以下操作:

  • LHS
    包装在
    c(.)
    中,确保列名为字符串和
  • j
    的最后一行(即“返回”值)应该是一个列表


.SD
非常棒,因为它是一个很棒的速记工具。然而,在不需要它封装的所有列的情况下调用它,会给代码带来额外的内存开销。如果只使用一个列,请考虑显式命名该列,或者添加<代码> .SDCOLs 参数(在<代码> j>代码>之后)并命名需要的列。 也许是个愚蠢的问题。。但在您的示例中,只有“RelativeIncomeLog2*100”会被分配到新的IncomeColumn。但是,如果我想要两个对应于“RelativeIncome”和“RelativeIncomeLog2*100”的新列呢?@varuman,这不是一个愚蠢的问题。简短的回答是将最后一行包装在
列表(.)中。
有关详细信息,请参见上面的编辑。@Ricardosporta,我认为在结尾
}
中使用
by=…
是错误的?它不应该出现在
列表(.)之后吗?
声明?谢谢你抓住了我的疏忽。Edited&fixedRicardo的回答可能澄清了这一点,但函数
J()
[.data.table
J
参数不同。请尝试
?J
?`[.data.table`
了解详细信息。
J()
用于
[.data.table
i
参数中的联接。另请参见
     dat<-dat[,{colA;colB;RelativeIncome=Income/.SD[Nation=="America",Income];
               ,RelativeIncomeLog2=log2(RelativeIncome)])) 
               ,by=list(Name,Nation)]
  dat[ , c("NewIncomeComlumn", "AnotherNewColumn") := { 
                 RelativeIncome     <- Income/.SD[Nation == "A", Income];   
                 RelativeIncomeLog2 <- log2(RelativeIncome);  
                 ## this last line is what will be asigned.
                 list(RelativeIncomeLog2 * 100,  c("A", "hello", "World"))
                 # assigned values are recycled as needed.
                 # If the recycling does not match up, a warning is issued. 
                }
                , by = list(Name, Nation)
               ]
 Income / .SD[Nation == "America", Income]

 # Which instead could simply be: 
 Income / Income[Nation == "America"]