Выберите строки в зависимости от того, находится ли значение столбца в верхней части X столбцов.

List - упорядоченная последовательность элементов, тогда как Set - это отдельный список неупорядоченных элементов (спасибо, Quinn Taylor ).

List:

Упорядоченный набор (также известный как последовательность). Пользователь этого интерфейса имеет точный контроль над тем, где в списке вставлен каждый элемент. Пользователь может получить доступ к элементам по их целочисленному индексу (позиция в списке) и искать элементы в списке.

Set:

Коллекция, которая не содержит повторяющихся элементов. Более формально множества не содержат пары элементов e1 и e2 таких, что e1.equals (e2) и не более одного нулевого элемента. Как видно из его имени, этот интерфейс моделирует математическую абстрактную абстракцию.

4
задан Ronak Shah 11 March 2019 в 15:20
поделиться

5 ответов

Мы можем циклически проходить по строкам с помощью apply (из base R) проверить, являются ли any элементов в 'a' или 'b' %in% группой sort ed для создания логического индекса и подмножество строк на основе этого

i1 <- apply(my.df, 1, function(x) any(x[1:2] %in% sort(x, decreasing = TRUE)[1:2]))
my.df[i1,]
#         a        b        c        d        e
#1  6.401462 5.318849 5.373496 5.101140 3.710973
#2  6.715845 4.786936 3.521965 4.264029 4.525138
#3  6.076211 5.356114 5.605134 5.443002 5.296778
#4  7.009623 5.275595 4.801874 4.355892 6.752737
#5  5.002059 6.163398 6.063694 2.409702 6.172111
#6  6.298305 3.291884 5.737053 4.701320 4.752406
#10 5.500374 4.400130 3.980433 6.203259 4.498614

Или используйте max.col из base R для создания логического индекса, и это будет намного быстрее и позволит избежать любых преобразований

i1 <- max.col(my.df, "first")
i2 <- max.col(replace(my.df, cbind(seq_len(nrow(my.df)), i1), -Inf), "first")
my.df[(i1 %in% 1:2) | (i2 %in% 1:2), ]
[ 1110] данные

my.df <- structure(list(a = c(6.401462, 6.715845, 6.076211, 7.009623, 
5.002059, 6.298305, 4.856246, 5.03799, 4.903592, 5.500374), b = c(5.318849, 
4.786936, 5.356114, 5.275595, 6.163398, 3.291884, 4.674743, 4.129333, 
3.135622, 4.40013), c = c(5.373496, 3.521965, 5.605134, 4.801874, 
6.063694, 5.737053, 5.550828, 4.797334, 5.879798, 3.980433), 
    d = c(5.10114, 4.264029, 5.443002, 4.355892, 2.409702, 4.70132, 
    7.501786, 5.143915, 5.639893, 6.203259), e = c(3.710973, 
    4.525138, 5.296778, 6.752737, 6.172111, 4.752406, 5.466611, 
    5.558161, 4.368915, 4.498614)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))

0
ответ дан akrun 11 March 2019 в 15:20
поделиться

Я прилагаю вам решение на основе data.table:

library(data.table)
my.df <- data.frame(a = rnorm(10,5), b= rnorm(10,5), c=rnorm(10,5), d=rnorm(10,5), e=rnorm(10,5))
my.df <- as.data.table(my.df)
my.df[my.df[,(sum(a<=.SD)<=2) | (sum(b<=.SD)<=2), by=seq_len(nrow(my.df))]$V1]
0
ответ дан LocoGris 11 March 2019 в 15:20
поделиться

A tidyverse возможность. Мы создаем row_index с использованием row_number и преобразуем кадр данных в длинный формат (gather), группируя по row мы filter группы, которые имеют верхние 2 значения «a» или «b», и преобразуем данные обратно в широкоформатный формат (spread).

library(tidyverse)

my.df %>%
   mutate(row = row_number()) %>%
   gather(key, value, -row) %>%
   group_by(row) %>%
   filter(any(key[order(value, decreasing = TRUE)[1:2]] %in% c("a", "b"))) %>%
   spread(key, value)

#    row     a     b     c     d     e
#  <int> <dbl> <dbl> <dbl> <dbl> <dbl>
#1     1  6.40  5.32  5.37  5.10  3.71
#2     2  6.72  4.79  3.52  4.26  4.53
#3     3  6.08  5.36  5.61  5.44  5.30
#4     4  7.01  5.28  4.80  4.36  6.75
#5     5  5.00  6.16  6.06  2.41  6.17
#6     6  6.30  3.29  5.74  4.70  4.75
#7    10  5.50  4.40  3.98  6.20  4.50

Я специально сохранил столбец row, чтобы мы знали, что строка 7-9 удалена, и если она не нужна, мы можем удалить ее с помощью ungroup() %>% select(-row).

0
ответ дан Ronak Shah 11 March 2019 в 15:20
поделиться

В конце концов я выбрал следующее решение. Вы добавляете 2 столбца, указывающих, в каком положении находятся значения столбцов a и b Затем вы поднабор на основе этих значений.

my.df$a.num <- as.numeric("") 
my.df$b.num <- as.numeric("") 


for (i in 1:nrow(my.df)){
  index <- sort(my.df[i,], decreasing = TRUE)
  a.num <- which(colnames(index) == "a")
  b.num <- which(colnames(index) == "b")
  my.df$a.num[i] <- LA
  my.df$b.num[i] <- LV}

my.df <- my.df[my.df$a.num < 3 | my.df$b.num < 3, ]
0
ответ дан joffie 11 March 2019 в 15:20
поделиться

Переберите все строки и проверьте, чтобы каждый ряд 1 или 2 находился в первых двух индексах order значений:

my.df <- data.frame(a = rnorm(10,5), b= rnorm(10,5), c=rnorm(10,5), d=rnorm(10,5), e=rnorm(10,5))
my.df <- my.df[sapply(1:nrow(my.df), function(x){any(c(1, 2) %in% order(my.df[x, ], decreasing = TRUE)[1:2])}),]

С примерами данных:

set.seed(1)
my.df <- data.frame(a = rnorm(10,5), b= rnorm(10,5), c=rnorm(10,5), d=rnorm(10,5), e=rnorm(10,5))
my.df

          a        b        c        d        e
1  4.373546 6.511781 5.918977 6.358680 4.835476
2  5.183643 5.389843 5.782136 4.897212 4.746638
3  4.164371 4.378759 5.074565 5.387672 5.696963
4  6.595281 2.785300 3.010648 4.946195 5.556663
5  5.329508 6.124931 5.619826 3.622940 4.311244
6  4.179532 4.955066 4.943871 4.585005 4.292505
7  5.487429 4.983810 4.844204 4.605710 5.364582
8  5.738325 5.943836 3.529248 4.940687 5.768533
9  5.575781 5.821221 4.521850 6.100025 4.887654
10 4.694612 5.593901 5.417942 5.763176 5.881108

Строки 3 и 10 должны быть удалены:

my.df <- my.df[sapply(1:nrow(my.df), function(x){any(c(1, 2) %in% order(my.df[x, ], decreasing = TRUE)[1:2])}),]
my.df

         a        b        c        d        e
1 4.373546 6.511781 5.918977 6.358680 4.835476
2 5.183643 5.389843 5.782136 4.897212 4.746638
4 6.595281 2.785300 3.010648 4.946195 5.556663
5 5.329508 6.124931 5.619826 3.622940 4.311244
6 4.179532 4.955066 4.943871 4.585005 4.292505
7 5.487429 4.983810 4.844204 4.605710 5.364582
8 5.738325 5.943836 3.529248 4.940687 5.768533
9 5.575781 5.821221 4.521850 6.100025 4.887654
0
ответ дан symbolrush 11 March 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: