Ведение рядов с минимальным количеством наблюдений на группу - PullRequest
1 голос
/ 19 сентября 2019

Со следующими данными я хотел бы удалить все строки, содержащие меньше или равные только 1, 1 или 2 с.Набор дат содержит 1 или 2.

mydata
      X1 X2 X3 X4 X5 X6 X7
    1  1  2  2  1  1  2  2
    2  2  2  2  1  2  2  2
    3  1  1  1  1  2  2  2
    4  2  1  2  1  2  2  1
    5  2  1  1  1  1  1  1
    6  1  1  1  1  1  1  1
    7  2  2  2  2  2  2  2

Удалите строки № 2,5,6 и 7, потому что

sum(mydata[2,]=="1") #2nd row contains only one 1.
sum(mydata[5,]=="2") #5th row contains only one 2.
sum(mydata[6,]=="2") #6th row contains only no 2.
sum(mydata[7,]=="1") #7th row contains only no 1

Благодарим вас за помощь.

Ответы [ 2 ]

3 голосов
/ 19 сентября 2019
d[rowSums(d == 1) > 1 & rowSums(d == 2) > 1,]
#  X1 X2 X3 X4 X5 X6 X7
#1  1  2  2  1  1  2  2
#3  1  1  1  1  2  2  2
#4  2  1  2  1  2  2  1
2 голосов
/ 19 сентября 2019

Один из вариантов - циклически проходить по строкам, получая table и проверять, больше ли частота всех элементов, чем 1 (на случай, если в строке больше уникальных элементов)

mydata[apply(mydata, 1, function(x) all(table(factor(x, levels = 1:2)) >1)),]
#. X1 X2 X3 X4 X5 X6 X7
#1  1  2  2  1  1  2  2
#3  1  1  1  1  2  2  2
#4  2  1  2  1  2  2  1

данные

mydata <- structure(list(X1 = c(1L, 2L, 1L, 2L, 2L, 1L, 2L), X2 = c(2L, 
2L, 1L, 1L, 1L, 1L, 2L), X3 = c(2L, 2L, 1L, 2L, 1L, 1L, 2L), 
    X4 = c(1L, 1L, 1L, 1L, 1L, 1L, 2L), X5 = c(1L, 2L, 2L, 2L, 
    1L, 1L, 2L), X6 = c(2L, 2L, 2L, 2L, 1L, 1L, 2L), X7 = c(2L, 
    2L, 2L, 1L, 1L, 1L, 2L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7"))
...