2016-11-08 3 views
2

Извините, если это уже было задано, но я искал и не смог найти точный пример того, что я пытаюсь сделать. Я пытаюсь подмножить dataframe, чтобы исключить строки, которые имеют совпадающие числовые значения в пяти столбцах. Например, для следующего dataframe, ДФ, я бы хотел, чтобы вернуть новый dataframe только со строками 1: 2, 5: 6 и 8:10:R подмножество строк, где значения в нескольких столбцах не совпадают

Row A B C D E 
1 1 1 2 3 1 
2 4 1 2 3 5 
3 2 2 2 2 2 
4 5 5 5 5 5 
5 4 4 2 3 4 
6 2 1 3 5 2 
7 3 3 3 3 3 
8 3 2 5 3 3 
9 2 1 2 2 4 
10 3 3 3 2 3 

У меня возникли проблемы, выяснить, как для этого более двух столбцов. Я пробовал следующее и знаю, что они не правы.

df2 <- df[!duplicated(df, c("A", "B", "C", "D", "E"))] 

и

df2 <- df[df$A==df$B==df$C==df$D==df$E,] 

Спасибо заранее.

ответ

1

Кадры данных обычно работают по столбцам, а не по ряду, поэтому ваша попытка duplicated не работает. (Это проверяет наличие повторяющихся строк в этих столбцах.) И ваш == не работает, потому что == является двоичным оператором, df$A == df$B будет TRUE или FALSE, а затем (df$A == df$B) == df$C (подразумеваемые круглые скобки) будет тестироваться, еслиимеет значение TRUE или FALSE.

apply - хороший способ запускать функцию на каждом строке. Он преобразует ваш фрейм данных в матрицу для запуска функции, но в этом случае все столбцы от A до E являются числовыми. Вот один из способов:

df[apply(df[, -1], 1, function(x) length(unique(x))) > 1, ] 
# Row A B C D E 
# 1 1 1 1 2 3 1 
# 2 2 4 1 2 3 5 
# 5 5 4 4 2 3 4 
# 6 6 2 1 3 5 2 
# 8 8 3 2 5 3 3 
# 9 9 2 1 2 2 4 
# 10 10 3 3 3 2 3 

Вы можете придумать все виды различных функций apply для проверки всех элементов, являющихся одинаковыми.

Я предположил, что у вас есть столбец с именем . Если это не так, оставьте в моем коде выше -1.


Использование этих данных, воспроизводимого совместно с dput().

df = structure(list(Row = 1:10, A = c(1L, 4L, 2L, 5L, 4L, 2L, 3L, 
3L, 2L, 3L), B = c(1L, 1L, 2L, 5L, 4L, 1L, 3L, 2L, 1L, 3L), C = c(2L, 
2L, 2L, 5L, 2L, 3L, 3L, 5L, 2L, 3L), D = c(3L, 3L, 2L, 5L, 3L, 
5L, 3L, 3L, 2L, 2L), E = c(1L, 5L, 2L, 5L, 4L, 2L, 3L, 3L, 4L, 
3L)), .Names = c("Row", "A", "B", "C", "D", "E"), class = "data.frame", row.names = c(NA, 
-10L)) 
+0

Спасибо! Это было именно то, что мне нужно. –

1

Вы можете просто сравнить все столбцы с одного столбца и посмотреть, если все же

df[rowSums(df[-1] == df[, 1]) < (ncol(df) - 1), ] 
# A B C D E 
# 1 1 1 2 3 1 
# 2 4 1 2 3 5 
# 5 4 4 2 3 4 
# 6 2 1 3 5 2 
# 8 3 2 5 3 3 
# 9 2 1 2 2 4 
# 10 3 3 3 2 3 

Или просто df[rowSums(df == df[, 1]) < (ncol(df)), ]


Или так же, вы можете избежать преобразования матрицы все вместе и объединения Reduce и lapply

df[!Reduce("&" , lapply(df, `==`, df[, 1])), ] 
# A B C D E 
# 1 1 1 2 3 1 
# 2 4 1 2 3 5 
# 5 4 4 2 3 4 
# 6 2 1 3 5 2 
# 8 3 2 5 3 3 
# 9 2 1 2 2 4 
# 10 3 3 3 2 3 
Смежные вопросы