Фильтрация данных в R с одинаковым идентификатором и определение строк, которые находятся в обоих кадрах данных, а какие строки не находятся в обоих кадрах данных - PullRequest
0 голосов
/ 05 января 2019

Кто-нибудь знает другой метод фильтрации данных, когда во фрейме данных имеется дважды одинаковый идентификатор (столбец X), но с другим ассоциированным значением (столбцы Y)?

В основном я хочу знать, какие строки находятся в обоих фреймах данных, и после того, как я хочу узнать, какая строка не находится в обоих фреймах данных (на самом деле я хочу значения X и Y этой конкретной строки)

Заранее благодарю за помощь!

   > x <- seq(1:10)
    > x[5] <- 4
    > y <- (seq.int(1,19,2))
    > 
    > x<- cbind(x,y)
    > x
           x  y
     [1,]  1  1
     [2,]  2  3
     [3,]  3  5
     [4,]  4  7
     [5,]  4  9
     [6,]  6 11
     [7,]  7 13
     [8,]  8 15
     [9,]  9 17
    [10,] 10 19
    > 
    > z <- x[1:4,]
    > y <- x[6:10,]
    > 
    > z <- rbind(z,y)
    > z
           x  y
     [1,]  1  1
     [2,]  2  3
     [3,]  3  5
     [4,]  4  7
     [5,]  6 11
     [6,]  7 13
     [7,]  8 15
     [8,]  9 17
     [9,] 10 19
    > 
    > df1 <- z[z[,1] %in% x[,1]] 
    > 
    > matrix(df1,9,2) # As expected I'm getting 9 rows
          [,1] [,2]
     [1,]    1    1
     [2,]    2    3
     [3,]    3    5
     [4,]    4    7
     [5,]    6   11
     [6,]    7   13
     [7,]    8   15
     [8,]    9   17
     [9,]   10   19
    > 
    > # Now I want to know what is the value inside the missing row
    > df2 <- z[!z[,1] %in% x[,1]] 
    > 
    > matrix(df2,1,2) # I'm getting NA and NA, bu I was expecting the values 4 and 9
         [,1] [,2]
    [1,]   NA   NA

Ответы [ 5 ]

0 голосов
/ 05 января 2019

Поскольку моя настоящая проблема не была опубликована, поскольку она была слишком сложной.

По сути, мне не удалось применить какое-либо решение к моей реальной проблеме, поскольку мои реальные фреймы данных содержали все типы данных и имели много столбцов.

Но мне удалось найти решение, которое работает не только для моей реальной проблемы, но и для проблемы, указанной в вопросе, поэтому я отправляю ответ, чем решил мою настоящую проблему в случае, если она может быть кому-то полезна!

> dup <- which(duplicated(x[,1]) == TRUE)
> ans <- matrix(x[dup,],1,2)
> ans
     [,1] [,2]
[1,]    4    9

> # I'm doing this in case the answer was not NA in df2 at the previous step, without
  # providing the row "missing"
> df2 <- rbind(df2, ans)
> df2
     [,1] [,2]
[1,]    4    9
0 голосов
/ 05 января 2019

Чтобы использовать метод @hansjaneinvielleicht:

xlist <- paste(x[,1], x[,2])
zlist <- paste(z[,1], z[,2])

setdiff(xlist, zlist)
# [1] "4 9"
0 голосов
/ 05 января 2019

Я использую cumcount здесь, чтобы добавить еще один ключ для различения повторяющегося значения в x[,1]

v=ave(x[,1]==x[,1], x[,1], FUN=cumsum)
t=ave(z[,1]==z[,1], z[,1], FUN=cumsum)
df2 <- x[!paste(x[,1],v) %in% paste(z[,1],t)]
matrix(df2,1,2)
     [,1] [,2]
[1,]    4    9
0 голосов
/ 05 января 2019
x <- data.frame(x)
z <- data.frame(z)
x$from <- "x"
z$from <- "z"

df2 <- merge(x, z, by = c("x", "y"), all.x = T)
df2
# x  y from.x from.y
# 1   1  1      x      z
# 2   2  3      x      z
# 3   3  5      x      z
# 4   4  7      x      z
# 5   4  9      x   <NA>
# 6   6 11      x      z
# 7   7 13      x      z
# 8   8 15      x      z
# 9   9 17      x      z
# 10 10 19      x      z

df2 <- df2[is.na(df2$from.y),]
df2
# x y from.x from.y
# 5 4 9      x   <NA>
0 голосов
/ 05 января 2019

Что вы здесь делаете, это фильтруете значения, которых нет в x[,1]. Однако, так как там 4, он также отфильтрован.

Вместо этого я предполагаю, что вы, вероятно, захотите поработать с методом setdiff из dplyr ( см. Документ здесь )

Затем используйте df2 <- setdiff(x, z)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...