Как удалить строки в R на основе заданных c критериев - PullRequest
0 голосов
/ 05 мая 2020

У меня есть динамический c фрейм данных в R - это таблица иерархии, созданная на основе ввода данных пользователем. Я пытаюсь удалить строки, в которых есть дубликаты, по определенным критериям. Таким образом, таблица не всегда представляет собой x количество столбцов или y количество строк, она всегда будет меняться в зависимости от ввода пользователя.

Фрейм данных (для одного примера) выглядит следующим образом:
Класс 1 --- Класс 2 --- Класс 3 --- Класс 4
Ca sh ----- -NA -------- NA -------- NA
Ca sh ------ Ca sh ------ NA ------ --NA
Ca sh ------ Ca sh ------ Ca sh ------ NA
Правительство-NA ------- NA -------- NA
Government-Security-NA -------- NA
Government-Security-Security - NA
Government-Security-Security - Код

Этот конкретный пример c продолжается примерно еще для 1100 строк.

Где я хотел бы удалить строки, в которых есть два одинаковых значения столбца, не включая NA. В приведенном выше примере «Ca sh NA NA NA» останется в кадре данных, но две другие строки ca sh будут исключены. "Governemnt NA NA NA" и "Правительственная безопасность NA NA" останутся, но "Правительственная безопасность NA NA" будет удалена, потому что это в основном то же самое, что и строка выше.

Код, который я использую для этого сейчас, следующий:

sub.df2 = sub.df2[apply(sub.df2, MARGIN = 1, FUN = function(x) !any(duplicated(x, incomparables = NA))), , drop = FALSE]

Однако при этом удаляется последняя строка - «Код безопасности государственной безопасности», и я нужно, чтобы эта линия оставалась и около 100-200 человек в том же стиле.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Может быть, вы сможете сделать это так, как было предложено, и после этого использовать функцию na.omit(df2), чтобы избавиться от всех «неполных» строк; чем у вас снова будет последняя строка (действительно только в том случае, если ваши критерии для сохранения - это строка без NAs)

# your function
df_red <- df2[apply(df2, MARGIN =  1, FUN = function(x) !any(duplicated(x, incomparables = NA))), , drop = FALSE]

# new dataframe with na.omit() 
df_naOmit <- na.omit(df2)

# combine two dataframes
df_new <- rbind(df_red,df_naOmit)

Фрейм данных df_new включает только столбцы без дубликатов, но также и последнюю полностью заполненную строку.

1 голос
/ 05 мая 2020

Поскольку вы действительно просто ищете уникальные строки , удаляя идентичные элементы в строке, попробуйте следующее:

df2a <- apply(df2, 1, unique)
df2a
# [[1]]
# [1] "Cash" NA    
# [[2]]
# [1] "Cash" NA    
# [[3]]
# [1] "Cash" NA    
# [[4]]
# [1] "Government" NA          
# [[5]]
# [1] "Government" "Security"   NA          
# [[6]]
# [1] "Government" "Security"   NA          
# [[7]]
# [1] "Government" "Security"   "Code"      

Теперь мы можем использовать duplicated на list:

df2b <- df2a[!duplicated(df2a)]
df2b
# [[1]]
# [1] "Cash" NA    
# [[2]]
# [1] "Government" NA          
# [[3]]
# [1] "Government" "Security"   NA          
# [[4]]
# [1] "Government" "Security"   "Code"      

Мы могли бы попытаться объединить их обратно в рамку, но все они должны быть одинаковой длины (с добавлением NA), поэтому:

df2c <- lapply(df2b, `length<-`, max(lengths(df2b)))
df2c
# [[1]]
# [1] "Cash" NA     NA    
# [[2]]
# [1] "Government" NA           NA          
# [[3]]
# [1] "Government" "Security"   NA          
# [[4]]
# [1] "Government" "Security"   "Code"      

Наконец, рекомбинируйте в кадр:

as.data.frame(do.call(rbind, df2c))
#           V1       V2   V3
# 1       Cash     <NA> <NA>
# 2 Government     <NA> <NA>
# 3 Government Security <NA>
# 4 Government Security Code

Данные:

df2 <- structure(list(Class.1 = c("Cash", "Cash", "Cash", "Government", 
"Government", "Government", "Government"), Class.2 = c(NA, "Cash", 
"Cash", NA, "Security", "Security", "Security"), Class.3 = c(NA, 
NA, "Cash", NA, NA, "Security", "Security"), Class.4 = c(NA, 
NA, NA, NA, NA, NA, "Code")), class = "data.frame", row.names = c(NA, 
-7L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...