/ / określanie procentu identycznych odpowiedzi dla wielu zmiennych - r, bazy danych, analizy, danych-nauki

określanie procentu identycznych odpowiedzi dla wielu zmiennych - r, bazy danych, analizy, danych-nauki

Mam zestaw danych z wieloma zmiennymi, w tym26 zmiennych o wartościach od 1-12. Chcę usunąć wszystkie wiersze, w których co najmniej 80% wartości jest identyczne (więcej niż 21 1 "lub więcej niż 21 2" itd.). Nie mam pojęcia, jak to zrobić w R, i naprawdę doceniłbym kilka pomysłów, jak podejść do tego problemu!

kiedy uruchamiam

out <- df1[apply(df1, 1, function(x) mean(x == Mode(x)) <= 0.8),]

kod na podzestawie zmiennych w jednej grupie, wartości zmiennych w drugiej grupie wszystkie stają się NA.

Oto 60 wierszy zbioru danych z 5 pytaniami z wszystkich trzech warunków: https://nofile.io/f/gBWymjYmQ2O/dataset

Moim oczekiwanym wynikiem jest df1 (który zawiera ponad 100 zmiennych), z usuniętymi wierszami z ponad 80% identycznymi odpowiedziami na 26 zmienionych zmiennych.

Odpowiedzi:

1 dla odpowiedzi № 1

Możemy przechodzić przez wiersze zestawu danych, uzyskiwać częstotliwość wartości, sprawdzać, czy najwyższa częsta wartość nie jest większa niż 80%, aby utworzyć logiczną vector i usuń wiersze na podstawie tego

Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}

out <- df1[apply(df1, 1, function(x)  mean(x == Mode(x)) <= 0.8),]

Aktualizacja

Na podstawie zbioru danych OP, w wierszach znajdują się NA, a niektóre wiersze mają wszystkie NA. Możemy zmienić kod, aby usunąć te wiersze z wszystkimi NA i tymi, które mają 80% takich samych wartości

Mode <- function(x) {
ux <- unique(x[!is.na(x)])
ux[which.max(tabulate(match(x, ux)))]
}

df1[ apply(df1, 1, function(x)  mean(x == Mode(x), na.rm = TRUE) <= 0.8 & !all(is.na(x))),]

dane

set.seed(24)
df1 <- as.data.frame(matrix(sample(1:12, 26 *20, replace = TRUE), ncol = 26))
df1[c(1, 3, 7),1:21] <- 5