我正在用R撰写论文,如果可能的话,我希望得到一些帮助。
我有一个名为tkalp的表,该表有2列和3001行,在执行“子集”命令后,我编写了该表,现在包含1084行并称为kp。 kp的一些值是:
如您所见, V1 列中的某些值以step = 2连续,有些则不是。
所以我的困难是:
1。。我想将此大列表/表“分解”为仅包含连续数字的较小列表/表。由于这个困难,我尝试使用以下命令来实现它,但是并没有按计划进行:
for (n in 1:nrow(kp)) {
kp1 <- subset(kp, kp[n+1,1] - kp[n,1])==2)
}
2。。完成此任务后,我只想保留包含10行以上的子列表。
任何想法或帮助都非常受欢迎!非常感谢
编辑
我上传了一张桌子的图片,并且我将要包含在不同桌子中的数字分开了。我想对所有原始表执行此操作。
蓝色的表格比原始表格小一号
黑色另一个
另一个黄色
红色另一个
在创建所有较小的表之后,我只想保留包含10个以上数字的表。例如,我不想保留黄色表,因为它仅包含4个数字。
再次感谢您
答案 0 :(得分:1)
那
df <- data.frame(V1=c(1,3,5,10,12,14, 20, 22), V2=runif(8))
df$diff <- c(2,diff(df$V1))
df$numSubset <- cumsum(df$diff != 2) + 1
iter <- seq(max(df$numSubset))
purrr::map(iter, function(i) filter(df, numSubset == i))
listOfSubsets <- purrr::map(iter, function(i) dplyr::filter(df, numSubset == i))
然后,您遍历列表并仅选择所需的那些。 Btw purrr还提供了一种无需循环即可过滤得到的列表的方法。查看purrr的文档。
答案 1 :(得分:0)
以R为底
kp=data.frame(V1=c(seq(8628,8618,by=-2),seq(8576,8566,by=-2),78,76),V2=runif(14))
kp$diffV1=c(-2,diff(kp$V1))/-2
kp$group=cumsum(ifelse(kp$diffV1/-2==1,0,1))+1
lkp=split(kp,kp$group)
# > kp
# V1 V2 diffV1 group
# 1 8628 0.74304325 -2 1
# 2 8626 0.84658101 -2 1
# 3 8624 0.74540089 -2 1
# 4 8622 0.83551473 -2 1
# 5 8620 0.63605222 -2 1
# 6 8618 0.92702915 -2 1
# 7 8576 0.81978587 -42 2
# 8 8574 0.01661538 -2 2
# 9 8572 0.52313859 -2 2
# 10 8570 0.39997951 -2 2
# 11 8568 0.61444445 -2 2
# 12 8566 0.23570017 -2 2
# 13 78 0.58397923 -8488 3
# 14 76 0.03634809 -2 3