2013-09-19 4 views
0

дали dataframe например:Подменит dataframes на основе значений столбцов в г

a <- c(1:3,4:6) 
b <- c(2:4,3,2,1) 
c <- cbind(a,b) 

Я хотел бы подмножество dataframe пути удаления строк с аналогичным сравнением (например: row3: 3,4 такими же, как row4: 4, 3) и имеют только один из них.

+4

'c' функция в R и никогда не должны использоваться в качестве имени переменной. – dayne

+0

Можете ли вы поделиться тем, что вы пробовали до сих пор? Это довольно простой вопрос, на который, вероятно, уже был дан ответ. Вы обнаружите, что получите гораздо лучшие ответы, если не только предоставить некоторые данные, но и поделиться своими шагами по решению проблемы самостоятельно. – Justin

+0

Извините. Мой DataFrame огромен (90M строк). Я использовал следующие шаги для подмножества данных. – Ram

ответ

2

Предполагая d ваша матрица, а не c:

e <- unique(apply(d,1,function(x) paste(sort(x),collapse="~"))) 
> t(sapply(strsplit(e,"~"),as.numeric)) 
    [,1] [,2] 
[1,] 1 2 
[2,] 2 3 
[3,] 3 4 
[4,] 2 5 
[5,] 1 6 

разбив его:

Первая линия

apply(d,1,function(x) ...) берет каждую строку д и передает его в качестве вектора x к анонимную функцию, чье тело я назвал здесь ....

Тело функции paste(sort(x),collapse="~"), которое сортирует вектор и затем превращает его в вектор длины с каждым элементом, разделенным ~.

Таким образом, общая сумма вызовов будет возвращать вектор символов, где каждый элемент использовался как строка матрицы.

Тогда unique хранит только уникальные элементы. Сортировка гарантирует, что это делает то, что мы хотим.

Вторая линия

strsplit(e,"~") разделяет наш вектор символов обратно в разделенном виде. В этом случае это список, в котором каждый элемент является символьным вектором чисел, составляющих каждую строку.

sapply(...,as.numeric) применяет as.numeric() к каждому элементу списка. Поэтому мы преобразуем вектор символов обратно в числовой вектор. Поскольку s в sapply означает «упростить», он создаст из этого матрицу.

Но это неправильное направление (2x5 вместо 5x2)! t() переносит матрицу в исходную форму.

+0

+1, но вы должны действительно объяснить, что это делает шаг за шагом, потому что это, вероятно, не очевидно для тех, кто не очень знаком с R – nico

+0

Просто (возможно) второстепенное. Это работает, но меняет порядок a и b, если a> b ... который может быть нежелательным. – nico

+0

Вы правы. Он также предполагает, что все числовое. Чтобы избежать первой проблемы, вы можете использовать '! Duplicated' вместо' unique' (потому что тогда вы можете использовать логический вектор для выбора из исходной матрицы). Я считаю, что это то, что делает решение @ dayne. –

3
a <- c(1:3,4:6) 
b <- c(2:4,3,2,1) 
d <- cbind(a,b) 
e <- t(apply(d,1,function(x){x[order(x)]})) 
d <- d[!duplicated(e),] 

> d 
    a b 
[1,] 1 2 
[2,] 2 3 
[3,] 3 4 
[4,] 5 2 
[5,] 6 1 
1

в вашем примере, c не является data.frame, а матрицей. c не следует использовать как имя переменной, как указано в других.

в одной строке, вы можете сделать:

a <- c(1:3,4:6) 
b <- c(2:4,3,2,1) 
cc <- cbind(a,b) 
cc[!duplicated(t(apply(cc,1,sort))), ] 
    a b 
[1,] 1 2 
[2,] 2 3 
[3,] 3 4 
[4,] 5 2 
[5,] 6 1 
Смежные вопросы