从一个更大的列表中创建子列表

时间:2018-10-02 17:53:17

标签: r list subset sublist

我正在用R撰写论文,如果可能的话,我希望得到一些帮助。

我有一个名为tkalp的表,该表有2列和3001行,在执行“子集”命令后,我编写了该表,现在包含1084行并称为kp。 kp的一些值是:enter image description here

如您所见, V1 列中的某些值以step = 2连续,有些则不是。

所以我的困难是:

1。。我想将此大列表/表“分解”为仅包含连续数字的较小列表/表。由于这个困难,我尝试使用以下命令来实现它,但是并没有按计划进行:

for (n in 1:nrow(kp)) {
  kp1 <- subset(kp, kp[n+1,1] - kp[n,1])==2)
}

2。。完成此任务后,我只想保留包含10行以上的子列表。

任何想法或帮助都非常受欢迎!非常感谢

编辑

我上传了一张桌子的图片,并且我将要包含在不同桌子中的数字分开了。我想对所有原始表执行此操作。kp

蓝色的表格比原始表格小一号

黑色另一个

另一个黄色

红色另一个

在创建所有较小的表之后,我只想保留包含10个以上数字的表。例如,我不想保留黄色表,因为它仅包含4个数字。

再次感谢您

2 个答案:

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