Циклическая «одинаковая» функция по всем столбцам данных - PullRequest
0 голосов
/ 19 декабря 2018

с учетом фрейма данных, например:

df <- data.frame(A.a = c("a","b","c"),
                 A.b = c("a","b","c"),
                 A.c = c("aa","bb","cc"),
                 B.a = c("w","x","y"))

Я бы хотел зациклить "одинаковую" функцию по всем столбцам фрейма данных.До сих пор я был в состоянии создать эту функцию:

loop.col.identical <- function(df){
    for i in colnames(df){
        cat(identical(df[[i]], df[[i]]))
    }
}

Но он просто сравнивает каждый столбец с самим собой, выводя TRUE для всего.Я хотел бы определить, что столбцы Aa и Ab идентичны, но Ac отличается, учитывая, что они также должны быть идентичными.Обратите внимание, что это небольшой пример, мои реальные данные имеют гораздо больше столбцов и строк.

Pd: извините за формат, но я на моем телефоне

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вот одна идея.

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

dat <- expand.grid(x = names(df), y = names(df))
dat <- dat[dat$x != dat$y, ]
dat <- data.frame(t(apply(dat, 1, sort)), stringsAsFactors = FALSE)
dat <- dat[!duplicated(dat), ]
names(dat) <- c("x", "y")

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

dat$Result <- mapply(function(x, y){
  identical(df[[x]], df[[y]])
}, dat$x, dat$y, SIMPLIFY = TRUE)

dat
#      x   y Result
# 2  A.a A.b   TRUE
# 3  A.a A.c  FALSE
# 4  A.a B.a  FALSE
# 7  A.b A.c  FALSE
# 8  A.b B.a  FALSE
# 12 A.c B.a  FALSE

Обновление

Как уже упоминалось @thelatemail, функция combn облегчает выполнение первой части.

dat <- data.frame(t(combn(names(df), 2)), stringsAsFactors = FALSE)

dat$Result <- mapply(function(x, y){
  identical(df[[x]], df[[y]])
}, dat$X1, dat$X2, SIMPLIFY = TRUE)

dat
#    X1  X2 Result
# 1 A.a A.b   TRUE
# 2 A.a A.c  FALSE
# 3 A.a B.a  FALSE
# 4 A.b A.c  FALSE
# 5 A.b B.a  FALSE
# 6 A.c B.a  FALSE
0 голосов
/ 19 декабря 2018

Если я правильно понимаю ваш вопрос, вы хотите выполнить парное сопоставление между различными столбцами в вашем фрейме данных.

expand.grid(x=colnames(df), y=colnames(df)) %>% 
  mutate(match = map2_lgl(x,y, ~identical(df[[.x]],df[[.y]]))) %>%
  spread(x,match)

Вот вывод:

    y   A.a   A.b   A.c   B.a
1 A.a  TRUE  TRUE FALSE FALSE
2 A.b  TRUE  TRUE FALSE FALSE
3 A.c FALSE FALSE  TRUE FALSE
4 B.a FALSE FALSE FALSE  TRUE

В зависимости от ваших потребностей вы можете игнорировать последнюю spread операцию.

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