как удалить все строки в кадре данных, имеющие 0 и Err: 502 в различных столбцах - PullRequest
1 голос
/ 19 апреля 2019

У меня есть фрейм данных с 26 столбцами и 100000 строк. во фрейме данных есть значения как положительные, так и отрицательные, 0 и Err: 502.

Мне нужно удалить все строки во фрейме данных, имеющие 0 и Err: 502

здесь я даю пример фрейма данных

Dataframe: ss
A    B            C          D      E
C    -1.3456    1.232    23.5453    0
B    56.258     0         -1.00023  234.556
D    43.22435   324.5657 1.00032    345.7
E    Err:502    341.4656 1.9823     32.12
E    0          Err:502  2324       asd
F    0.0004342  234      12         78.31214
F    dfgd       2.313    0.000487   0.12345



ss <- ss[apply(ss[,-1], 1, function(x) !all(x==0)),]
ss[ss != 0, ]



the expected data frame ss should be like as follows 
A         B       C       D      E
D    43.22435   324.5657 1.00032    345.7
F    0.0004342  234      12         78.31214
F    dfgd       2.313    0.000487   0.12345

но код, который я использовал, не работает.
заранее спасибо

Ответы [ 3 ]

2 голосов
/ 19 апреля 2019

Мы можем использовать rowSums в базе R

df[rowSums(df == 0 | df == "Err:502") == 0, ]

# A         B        C         D        E
#3 D  43.22435 324.5657  1.000320    345.7
#6 F 0.0004342      234 12.000000 78.31214
#7 F      dfgd    2.313  0.000487  0.12345

Или с apply

df[apply(df, 1, function(x) all(x != 0 & x != "Err:502")), ]
2 голосов
/ 19 апреля 2019

Использование data.table:

library(data.table)
df <- as.data.table(df)
out <- df[df[, !Reduce(`|`, lapply(.SD, function(x) x ==0 | x == "Err:502"))]]
2 голосов
/ 19 апреля 2019

мы можем использовать filter_at

library(dplyr)
ss %>%
    filter_at(-1, all_vars(!.  %in% c(0, "Err:502")))
#   A         B        C         D        E
#1 D  43.22435 324.5657  1.000320    345.7
#2 F 0.0004342      234 12.000000 78.31214
#3 F      dfgd    2.313  0.000487  0.12345

Или используя base R

ss[!Reduce(`|`, lapply(ss[-1], `%in%`, c(0, "Err:502"))),]

ПРИМЕЧАНИЕ. Оба метода эффективны по сравнению с apply

Код ОП с apply можно исправить как

ss[apply(ss, 1, function(x) all(! x %in% c(0, "Err:502"))), ]
#  A         B        C         D        E
#3 D  43.22435 324.5657  1.000320    345.7
#6 F 0.0004342      234 12.000000 78.31214
#7 F      dfgd    2.313  0.000487  0.12345

данные

ss <- structure(list(A = c("C", "B", "D", "E", "E", "F", "F"), B = c("-1.3456", 
"56.258", "43.22435", "Err:502", "0", "0.0004342", "dfgd"), C = c("1.232", 
"0", "324.5657", "341.4656", "Err:502", "234", "2.313"), D = c(23.5453, 
-1.00023, 1.00032, 1.9823, 2324, 12, 0.000487), E = c("0", "234.556", 
"345.7", "32.12", "asd", "78.31214", "0.12345")),
 class = "data.frame", row.names = c(NA,  -7L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...