有条件地编辑数据表中每组的最后一行

时间:2018-04-17 21:11:56

标签: r datatable

我有以下示例性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中解决。

1 个答案:

答案 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))