对于给定的数据框:
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的行将被删除。
答案 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
)