数据拆分基于R中的逻辑关系

时间:2016-03-30 04:43:35

标签: python r logical-operators data-cleaning

我有一个包含历史数据的数据集,我想把它分成两组:

  1. 我连续两年拥有数据的ID集。
  2. 它是补充,即我拥有一年或多年数据但在非连续年份的ID集合。
  3. 例如,让我们采用数据集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}同时显示在BB',因为它有连续年份和一年的记录。

    我不必在R中执行此操作,我也可以使用Python。任何帮助将不胜感激。

3 个答案:

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