Сохранение только отрицательных значений в нескольких столбцах во фрейме данных - PullRequest
0 голосов
/ 14 июля 2020

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

Staff.Confirmed Residents.Confirmed Staff.Deaths Resident.Deaths Staff.Recovered Residents.Recovered          State
1                0                   1            0               0               0                   0        Alabama
2                0                   0            0               0               0                   0         Alaska
3                0                   0            0               1               0                   0        Arizona
4                0                 -61            0               0               0                   0       Arkansas
5               21                  41            0               0               0                   9     California
6                0                  15            0               0              -1                   1       Colorado
7                2                  15            0               0               1                  21 

Итак, я хотел бы сохранить наблюдение, подобное Арканзасу, которое содержит отрицательное значение -61 в одном из столбцов, но удалить такое, как Калифорния, где ни одна из переменных не является отрицательной.

Кто-нибудь знает хороший способ сделать это? Спасибо за помощь!

Ответы [ 3 ]

2 голосов
/ 14 июля 2020

Вы можете использовать rowSums, чтобы подсчитать количество значений, которые меньше 0, и выбрать строки, где значение как минимум больше 1.

cols <- sapply(df, is.numeric)
df[rowSums(df[cols] < 0) > 0, ]


#  Staff.Confirmed Residents.Confirmed Staff.Deaths Resident.Deaths Staff.Recovered Residents.Recovered    State
#4               0                 -61            0               0               0                   0 Arkansas
#6               0                  15            0               0              -1                   1 Colorado

В dplyr вы можете использовать filter_if который был расширен, но я все еще считаю его полезным и простым для использования в строковых операциях.

library(dplyr)
df %>% filter_if(cols, any_vars(. < 0))
1 голос
/ 14 июля 2020

Попробуйте это base R решение:

#Create index
index <- which(names(df)=='State')
#Data
df$Var <- apply(df[,-index],1,function (x) length(which(x<0)))
#Filter
df2 <- df[df$Var!=0,]

Staff.Confirmed Residents.Confirmed Staff.Deaths Resident.Deaths Staff.Recovered Residents.Recovered    State
4               0                 -61            0               0               0                   0 Arkansas
6               0                  15            0               0              -1                   1 Colorado
0 голосов
/ 14 июля 2020

Другое базовое решение для поиска построчных отрицательных значений: вы можете do.call() с pmax() (который отмечает значения, меньшие 0 в списке, созданном lapply()). Это должно достаточно хорошо масштабироваться для большого набора данных.

df1[as.logical(do.call(pmax, lapply(df1[sapply(df1, is.numeric)], `<`, 0))), ]

  Staff.Confirmed Residents.Confirmed Staff.Deaths Resident.Deaths Staff.Recovered Residents.Recovered    State
4               0                 -61            0               0               0                   0 Arkansas
6               0                  15            0               0              -1                   1 Colorado

Data :

df1 <- read.table(header = TRUE, text = "Staff.Confirmed Residents.Confirmed Staff.Deaths Resident.Deaths Staff.Recovered Residents.Recovered          State
1                0                   1            0               0               0                   0        Alabama
2                0                   0            0               0               0                   0         Alaska
3                0                   0            0               1               0                   0        Arizona
4                0                 -61            0               0               0                   0       Arkansas
5               21                  41            0               0               0                   9     California
6                0                  15            0               0              -1                   1       Colorado
7                2                  15            0               0               1                  21           Misc")
...