我有这个代码:
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)]
Run Code Online (Sandbox Code Playgroud)
1)我想说"RelativeIncomeLog2=log2(RelativeIncome)",但是 "RelativeIncome"在j范围内是不可用的?
2)我尝试了以下代码(根据data.table FAQ).现在"RelativeIncome"可用,但它不添加列:
dat<-dat[,{colA;colB;RelativeIncome=Income/.SD[Nation=="America",Income];
,RelativeIncomeLog2=log2(RelativeIncome)]))
,by=list(Name,Nation)]
Run Code Online (Sandbox Code Playgroud)
您可以创建和分配对象j,只需使用{花括号}.
然后,您可以将这些对象(或对象的函数和计算)传递出去,j并将它们指定为data.table的列.要一次分配多个列,只需:
LHS在c(.) 确保列名字符串和j(即"返回"值)应该是一个列表. 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)
]
Run Code Online (Sandbox Code Playgroud)
你可以把它j当作一种在环境中的功能dat
如果需要,您还可以获得更复杂和复杂的功能.您也可以使用包含by参数 by=list(<someName>=col)
事实上,类似于函数,只是在其中创建一个对象j并为其赋值,并不意味着它将在外面可用j.为了将它分配给data.table,您必须将其返回. j自动返回最后一行; 如果最后一行是列表,则列表中的每个元素都将作为列处理.如果您通过引用分配(即使用:=),那么您将获得您期望的结果.
另外,我在您的代码中注意到以下内容:
Income / .SD[Nation == "America", Income]
# Which instead could simply be:
Income / Income[Nation == "America"]
Run Code Online (Sandbox Code Playgroud)
.SD很棒,因为它是一个很棒的速记.但是,要调用它而不需要它封装的所有列,就会增加代码的内存成本.如果您只使用单个列,请考虑显式命名该列,或者添加.SDcols参数(之后j)并命名其中所需的列.
| 归档时间: |
|
| 查看次数: |
276 次 |
| 最近记录: |