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"]