我有以下示例性DT:
set.seed(42)
test <- data.table(group=c(rep("A",3),rep("B",3),rep("C",3)),matrix(rnorm(81),9,3))
test[,.SD[.N],by=group]
最后一个命令显示每个组的最后一行。
我现在要做的是,计算一个新列,其值仅为每组的最后一行(否则为NA)。此列应测试V1是否> V2> V3,如果是,返回999,如果V3&gt; V2> V1,返回111,否则返回NA。
我使用通常的:=
运算符尝试了几个命令,但它似乎不适用于.SD[.N]
。这在当前版本的DT中是否可行?
感谢任何提示。如果可能,请在datatable
中解决。
答案 0 :(得分:1)
如果它不一定是data.table
解决方案,您可以这样做:
require(tidyverse)
require(data.table)
set.seed(42)
test <- data.table(group=c(rep("A",3),
rep("B",3),rep("C",3)),
matrix(rnorm(81),9,3))
test[,.SD[.N],by=group] %>%
mutate(newvalue = ifelse(V1 > V2 & V1 > V3, 999,
ifelse(V3 > V2 & V3 > V1,
111, NA)))
您可以使用更容易阅读的ifelse
,而不是使用嵌套的dplyr::case_when
。
test[,.SD[.N],by=group] %>%
mutate(newvalue =
case_when(V1 > V2 & V1 > V3 ~ 999,
V3 > V2 & V3 > V1 ~ 111))