如何基于满足R中的升序条件的列向量对列表进行子集化?
我有一个包含30个对象的列表,每个对象中有4列。我想通过检查每个对象中的第三列是升序还是降序来对列表进行子集/拆分。如果第2、4、11、16、19、21等对象的第3列向量按升序排列,则对列表进行子集化。
我拥有的样本数据如下所示>>
mydata [[a1]] A B C D 477.1149 106.6898314 10.80482 10.28718 469.4843 106.7315397 11.10778 10.65794 42.1 10.773248 11.40281 11.02817 453.9212 106.8149563 11.78007 11.42233 447.7579 106.8566646 12.03301 11.773 41.6 106.8983729 12.30212 12.11687 435.2942 106.9400812 12.59634 12.47315 429.2672 106.9817895 12.88163 12.82436 42.9352 17.0234978 13.19987 13.19136 [[b1]] A B C D 195.5 114.1556171 41.85957 31.42653 16.4776 11.1973254 41.62823 31.27387 19.408 11.2390337 41.41062 31.12951 198.30 14.280742 41.20588 30.98881 19.2327 11.3224503 40.9934 30.84694 20.2429 11.3641586 40.76652 30.69182 21.2545 4.4058669 40.54016 30.53915 20.3428 114.4475752 40.29467 30.38037 203.48 114.4892835 40.04356 30.21333 [[c1]] A B C D 150.42 11.7248034 56.22614 41.40349 11.6695 1.7665117 55.00748 40.16213 12.9522 11.80822 54.07732 39.22808 14.3145 14.8499283 53.32955 38.4687 15.7921 11.8916366 52.70304 37.83086 17.5311 11.9333449 52.13248 37.24863 19.226 11.9750532 51.69696 36.80191 11.1279 12.0167615 51.30663 36.40155 12.3976 12.0584698 51.07735 36.19506
根据上面提供的数据,在对象[[a1]]的Cth列向量中按升序排列,而其他两个对象在降序中。所以我正在寻找一个代码来检查每个对象的Cth列向量上的条件并拆分列表。为此,我尝试使用以下代码,但无法正常工作>
首先,我尝试检查列表中的第一个对象
is.ordered(mydata$a1[3])
我得到的结果是:
False
其他对象也将得到相同的结果...这是不正确的
for (i in seq_along(mydata)){ if (is.ordered(i[3]) <- TRUE) { mydata1 <- mydata[i] else mydata2 <- mydata[i] } }
这不起作用
预期结果如下
mydata1 [[a1]] A B C D 477.1149 106.6898314 10.80482 10.28718 469.4843 106.7315397 11.10778 10.65794 42.1 10.773248 11.40281 11.02817 453.9212 106.8149563 11.78007 11.42233 447.7579 106.8566646 12.03301 11.773 41.6 106.8983729 12.30212 12.11687 435.2942 106.9400812 12.59634 12.47315 429.2672 106.9817895 12.88163 12.82436 42.9352 17.0234978 13.19987 13.19136 mydata2 [[b1]] A B C D 195.5 114.1556171 41.85957 31.42653 16.4776 11.1973254 41.62823 31.27387 19.408 11.2390337 41.41062 31.12951 198.30 14.280742 41.20588 30.98881 19.2327 11.3224503 40.9934 30.84694 20.2429 11.3641586 40.76652 30.69182 21.2545 4.4058669 40.54016 30.53915 20.3428 114.4475752 40.29467 30.38037 203.48 114.4892835 40.04356 30.21333 [[c1]] A B C D 150.42 11.7248034 56.22614 41.40349 11.6695 1.7665117 55.00748 40.16213 12.9522 11.80822 54.07732 39.22808 14.3145 14.8499283 53.32955 38.4687 15.7921 11.8916366 52.70304 37.83086 17.5311 11.9333449 52.13248 37.24863 19.226 11.9750532 51.69696 36.80191 11.1279 12.0167615 51.30663 36.40155 12.3976 12.0584698 51.07735 36.19506
如何基于满足R中升序条件的列向量对列表进行子集化?我有一个包含30个对象的列表,每个对象中有4列。我想子集/拆分...
基于this answer,您可以使用all
和diff
检查数据帧元素中的列C
是否按升序排列。 sapply
用于对列表中的每个数据帧进行迭代,并在TRUE
以升序排列时返回布尔向量C
。
mydata <- list( a = data.frame(A = rnorm(10), B = runif(10), C = rev(1:10)), b = data.frame(A = rnorm(10), B = runif(10), C = 1:10), c = data.frame(A = rnorm(10), B = runif(10), C = sample(1:10, 10)), d = data.frame(A = rnorm(10), B = runif(10), C = 1:10) ) mydata[sapply(mydata, function(x) all(diff(x$C) >= 0))] #> $b #> A B C #> 1 -0.1266213 0.39444137 1 #> 2 -0.2983481 0.69384799 2 #> 3 -1.0826327 0.51337491 3 #> 4 0.1082822 0.62529737 4 #> 5 0.4650216 0.20580597 5 #> 6 0.4129133 0.10899147 6 #> 7 1.6014768 0.88541775 7 #> 8 0.7889176 0.99494885 8 #> 9 0.2097572 0.68434466 9 #> 10 -2.2161454 0.03854874 10 #> #> $d #> A B C #> 1 -0.1674129 0.1282160 1 #> 2 1.6887421 0.6871053 2 #> 3 -1.2915220 0.5023277 3 #> 4 0.6181605 0.8020529 4 #> 5 -1.0125448 0.4254577 5 #> 6 0.6019005 0.2033730 6 #> 7 -0.6954242 0.3959902 7 #> 8 -2.0667610 0.8642022 8 #> 9 -1.4052872 0.1155380 9 #> 10 1.3859010 0.5984434 10
由reprex package(v0.3.0)在2019-10-21创建