在条件上删除行

时间:2017-06-11 19:09:47

标签: r

对于给定的数据框:

public class MyClass {    
    public static void main(String[] args) {    
        Scanner input=new Scanner(System.in);    
        ArrayList<Integer> myList=new ArrayList<Integer>(10);    
        System.out.println("Enter your number:");    
        myList.add(416355);    
        myList.add(21212);    
        for(int x : myList)    
            System.out.println(x);    
        System.out.println("Size="+myList.size());    

    }
  }

当id更改时,我需要删除未结束为conv = 1的行。 对于我的例子,diff的等于43和7的行将被删除。

1 个答案:

答案 0 :(得分:1)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df1)),按'id'分组,我们找到'conv'为1('i1')的最后一个元素的索引,{{1它小于行数(if),从下一个元素获取序列到.N,获取行索引(.N)并使用它来删除行

.I

或者另一种选择是在'id'分组之后,我们得到'conv'的累加和然后乘以'conv',所以,0值通过乘法保持为0,那么我们可以得到最大的索引value.max获取数据集的序列和子集

library(data.table)
setDT(df1)[-df1[,  {i1 <- tail(which(conv==1), 1); if(i1 < .N) .I[(i1+1):.N]}, id]$V1]
#     id conv diff counter
# 1:  1    0    0       1
# 2:  1    0    3       1
# 3:  1    0   45       2
# 4:  1    1    9       2
# 5:  1    0   40       1
# 6:  1    1   34       2
# 7:  2    0    0       1
# 8:  2    1    5       1
# 9:  2    0    0       1
#10:  2    1   45       2
#11:  2    1   40       1

说明如何发生这种情况(使用setDT(df1)[, .SD[seq_len(which.max(cumsum(conv)*conv))], by = id]

提取列)
$V1

现在,我们发现'id'的末尾重复2s。'id'1的最后两个'2'值是我们需要删除的值,所以我们乘以'conv'

setDT(df1)[,  cumsum(conv), by = id]$V1
#[1] 0 0 0 1 1 2 2 2 0 1 1 2 3

并获取最大值的索引

setDT(df1)[,  cumsum(conv) * conv, by = id]$V1
#[1] 0 0 0 1 0 2 0 0 0 1 0 2 3

并对其进行排序

setDT(df1)[,  which.max(cumsum(conv) * conv), by = id]$V1
#[1] 6 5

使用它来对data.table(setDT(df1)[, seq_len(which.max(cumsum(conv) * conv)), by = id]$V1 #[1] 1 2 3 4 5 6 1 2 3 4 5

进行子集化