R 有条件地选择具有Data.Table的组中的行
我正在寻找使用data.table的解决方案―我有一个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 <- 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