как установить подмножество списка на основе возрастающего / убывающего порядка вектора столбца в R - PullRequest
3 голосов
/ 21 октября 2019

Как создать подмножество списка на основе вектора столбца, удовлетворяющего условию возрастания в R?

У меня есть список из 30 объектов, где в каждом объекте есть 4 столбца. Я хотел бы разделить / разделить список, проверив, находится ли 3-й столбец в каждом объекте в порядке возрастания или убывания. если 3-й столбец вектора 2-го, 4-го, 11-го, 16-го, 19-го, 21-го и т. д. объектов находится в порядке возрастания, то поднабор списка.

образец данных, которые у меня есть, отображается следующим образом

A <- c(477.119,469.483,42.1,453.912,447.7579,41.6,435.2942,429.2672,42.9352)
B <- c(106.98, 106.7397,10.748,106.563,106.646,106.9,106.812,106.98,17.08)
C <- c(10.804,11.108,11.402,11.780,12.033,12.302,12.59634,12.88163,13.19987)
D <- c(10.28718,10.65794,11.02,11.42,11.773,12.11,12.473,12.82436,13.19136)

a1 <- data.frame(A, B, C, D)

A1 <- c(195.5,16.4776,19.408,198.3052,19.2327,20.2429,21.2545,20.3428)
B1 <- c(114.155,114.197,114.239,114.28,114.322,114.364,114.405,114.447)
C1 <- c(41.85957,41.623,41.410,41.205,40.99,40.766,40.540,40.29467)
D1 <- c(31.42653,31.27387,31.129,30.981,30.844,30.6982,30.53915,30.38037)

b1 <- data.frame(A1, B1, C1, D1)

A2 <- c(150.42,11.66,12.95,14.31,15.79,17.531,19.226,11.1279)
B2 <- c(11.724,1.766,11.808,11.849,11.891,11.933,11.975,12.016)
C2 <- c(56.226,55.007,54.0772,53.3295,52.7034,52.1328,51.696,51.3063)
D2 <- c(41.409,40.113,39.228,38.4687,37.83086,37.24863,36.801,36.401)

c1 <- data.frame(A2, B2, C2, D2)
mydata <- list(a1, b1, c1)

из данных, представленных выше, вектор Cth столбца объекта [[a1]] находится в порядке возрастания, а два других объекта - в порядке убывания. поэтому я ищу код, чтобы проверить условие для вектора столбца Cth каждого объекта и разделить список. для этого я попытался использовать следующий код, но он не работает.

Примечание: в векторе столбца Cth / 3rd, когда это большой вектор, очень немногие значения не следуют порядку

сначала я попытался проверить 1-й объект в моем списке

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

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Возможно, это то, что вы хотите (или нет?)

idx <- c()
for (k in seq_along(mydata)){
  if (!is.unsorted(mydata[[k]]$C)) idx <- c(idx, k)
}
mydata.ascending <- mydata[idx]
mydata.descending <- mydata[-idx]

Использование !is.unsorted для определения возрастающей колонки

0 голосов
/ 21 октября 2019

Опираясь на этот ответ , вы можете использовать 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

Создано в 2019-10-21 * представительный пакет (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...