我有一个包含历史数据的数据集,我想把它分成两组:
例如,让我们采用数据集A:
A =
ID Year X Y
1 2010 2 3
1 2012 4 0
2 2011 4 3
2 2012 2 2
3 2010 3 1
3 2012 2 1
3 2013 0 3
我想得到集合B:
B =
ID Year X Y
2 2011 4 3
2 2012 2 2
3 2012 2 1
3 2013 0 3
B'=
ID Year X Y
1 2010 2 3
1 2012 4 0
3 2010 3 1
请注意,ID {3}同时显示在B
和B'
,因为它有连续年份和一年的记录。
我不必在R中执行此操作,我也可以使用Python。任何帮助将不胜感激。
答案 0 :(得分:3)
在[max-num/2, 0]
,
template<class writeIter>
void quicksort(writeIter begin, writeIter end)
{
if (begin!= end) {
int diff = end-begin;
if (diff > 2) {
writeIter pivot = ((end-begin) / 2) + begin;
writeIter itFirst = begin;
writeIter itSecnd = end-1;
auto pivotVal = *pivot;
swap(*pivot, *(end-1));
while (itFirst < itSecnd) {
if (*itFirst > pivotVal) {
while (*itSecnd > pivotVal && itSecnd > itFirst) --itSecnd;
if (itSecnd > itFirst)
swap(*itFirst, *itSecnd);
}
++itFirst;
}
swap(*itSecnd, *(end-1));
quicksort(begin, itSecnd);
quicksort(itSecnd, end);
}
else if (diff == 2)
if (*begin > *(begin+1))
swap(*begin, *(begin+1));
}
}
和
dplyr
这个想法非常简单:library(dplyr)
df %>% group_by(ID) %>% filter(Year %in% c(Year - 1, Year + 1))
# Source: local data frame [4 x 4]
# Groups: ID [2]
#
# ID Year X Y
# (int) (int) (int) (int)
# 1 2 2011 4 3
# 2 2 2012 2 2
# 3 3 2012 2 1
# 4 3 2013 0 3
分别评估每个df %>% group_by(ID) %>% filter(!Year %in% c(Year - 1, Year + 1))
# Source: local data frame [3 x 4]
# Groups: ID [2]
#
# ID Year X Y
# (int) (int) (int) (int)
# 1 1 2010 2 3
# 2 1 2012 4 0
# 3 3 2010 3 1
,然后group_by(ID)
只评估ID
值较小或一个较大的行超过该组的所有filter
值。添加Year
以反转逻辑并获取不符合该条件的行。
答案 1 :(得分:1)
您可以尝试使用基础R diff
查找Year
列中有1年差异的行的索引,获取下一行的索引并对其进行子集化。
df[sort(c(which(diff(df$Year) == 1),
which(diff(df$Year) == 1) + 1)), ]
# ID Year X Y
#3 2 2011 4 3
#4 2 2012 2 2
#6 3 2012 2 1
#7 3 2013 0 3
和
获取不属于第一个子集的所有行
df[!1:nrow(df) %in% c(which(diff(df$Year) == 1),
which(diff(df$Year) == 1) + 1), ]
# ID Year X Y
#1 1 2010 2 3
#2 1 2012 4 0
#5 3 2010 3 1
答案 2 :(得分:0)
使用data.table
library(data.table)
setDT(A)[, .SD[Year %in% c(Year-1, Year+1)] , ID]
# ID Year X Y
#1: 2 2011 4 3
#2: 2 2012 2 2
#3: 3 2012 2 1
#4: 3 2013 0 3
或者
setDT(A)[, .SD[!Year %in% c(Year-1, Year+1)] , ID]
# ID Year X Y
#1: 1 2010 2 3
#2: 1 2012 4 0
#3: 3 2010 3 1
这两个案例。
另一种选择是
setDT(A)[A[, {i1 <- .I[(Year - shift(Year, fill= Year[1]))==1]
c(i1-1,i1) }, ID]$V1]