Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 有条件地选择具有Data.Table的组中的行_R_Data.table - Fatal编程技术网

R 有条件地选择具有Data.Table的组中的行

R 有条件地选择具有Data.Table的组中的行,r,data.table,R,Data.table,我正在寻找使用data.table的解决方案―我有一个data.table,其中包含以下列: data <- data.frame(GROUP=c(3,3,4,4,5,6), YEAR=c(1979,1985,1999,2011,2012,1994), NAME=c("S","A","J","L","G","A")) data <- as.data.table(data) 对于每个组,我们希望使用以下

我正在寻找使用data.table的解决方案―我有一个data.table,其中包含以下列:

data <- data.frame(GROUP=c(3,3,4,4,5,6),
                    YEAR=c(1979,1985,1999,2011,2012,1994),
                    NAME=c("S","A","J","L","G","A"))

data <- as.data.table(data)
对于每个组,我们希望使用以下规则选择一行:

  • 如果存在年份>2000,请选择最小年份高于2000的行
  • 如果没有年份>2000,请选择具有最大年份的行
期望输出:

GROUP  YEAR    NAME
3      1985    Anderson
4      2011    Liam
5      2012    George
6      1994    Adams

谢谢!我已经为此挣扎了一段时间

使用
dplyr
软件包,我得到了如下输出(尽管这可能不是最简单的答案):


编辑:对不起,我的第一个答案没有考虑最小/最大条件。希望这有助于
数据。如果将特殊的
行计数器子集,则表应该简单得多。I
行计数器:

library(data.table)
setDT(data)
data[
  data[
        ,
        if(any(YEAR > 2000)) 
           .I[which.min(2000 - YEAR)] else
           .I[which.max(YEAR)],
        by=GROUP
      ]$V1
]
#   GROUP YEAR NAME
#1:     3 1985    A
#2:     4 2011    L
#3:     5 2012    G
#4:     6 1994    A
感谢@r2evans提供的背景信息-

.I
是一个整数向量,相当于
seq_len(nrow(x))

裁判:


因此,我在这里所做的就是为每个
by=
级别的每个
计算得到整个
数据的匹配行索引。然后再次使用这些行索引来子集
数据。

您还可以执行几个滚动联接:

res = unique(data[, .(GROUP)])

# get row with YEAR above 2000
res[, w := data[c(.SD, YEAR = 2000), on=.(GROUP, YEAR), roll=-Inf, which=TRUE]]

# if none found, get row with nearest YEAR below   
res[is.na(w), w := data[c(.SD, YEAR = 2000), on=.(GROUP, YEAR), roll=Inf, which=TRUE]]

# subset by row numbers
data[res$w]

   GROUP YEAR NAME
1:     3 1985    A
2:     4 2011    L
3:     5 2012    G
4:     6 1994    A

我在[.data.frame(data,if(any)(YEAR>2000)).I[which.min(2000-:未使用的参数(by=GROUP)中得到一个错误
error
它是否与您的工作方式完全相同?@user10626943-帖子被标记为
数据。table
因此我假设OP已经在处理
数据。table
-如果没有,您需要先转换。已经编辑过。对于后来者,
。I
是一个整数向量,相当于
seq_len(nrow(x))
。Ref:(我必须查找它:-)感谢tidyverse解决方案!以及格式指针。
   GROUP YEAR NAME
      3  1985   A
      4  2011   L
      5  2012   G
      6  1994   A
library(data.table)
setDT(data)
data[
  data[
        ,
        if(any(YEAR > 2000)) 
           .I[which.min(2000 - YEAR)] else
           .I[which.max(YEAR)],
        by=GROUP
      ]$V1
]
#   GROUP YEAR NAME
#1:     3 1985    A
#2:     4 2011    L
#3:     5 2012    G
#4:     6 1994    A
res = unique(data[, .(GROUP)])

# get row with YEAR above 2000
res[, w := data[c(.SD, YEAR = 2000), on=.(GROUP, YEAR), roll=-Inf, which=TRUE]]

# if none found, get row with nearest YEAR below   
res[is.na(w), w := data[c(.SD, YEAR = 2000), on=.(GROUP, YEAR), roll=Inf, which=TRUE]]

# subset by row numbers
data[res$w]

   GROUP YEAR NAME
1:     3 1985    A
2:     4 2011    L
3:     5 2012    G
4:     6 1994    A