Определите, какие кадры данных в списке являются уникальными в R - PullRequest
1 голос
/ 08 октября 2019

У меня большой список фреймов данных. Я хочу определить, какие уникальны, и присвоить им уникальные имена. Для небольшого примера, но мне нужно автоматизировать.

df1 <- data.frame(a = 1:10, b = 2:11, c = 3:12)
df2 <- df1
df3 <- data.frame(b = 2:11, a = 1:10, c = 3:12)

# this is 2 unique data frames 

dfs <- list(df1, df2, df3)
names(dfs) <- c('df1', 'df2', 'df3')

Я хочу идентифицировать и назвать уникальные кадры данных, хотя ниже приводится ошибка

names(unique(dfs)) = paste0('unique', 1:length(unique(dfs))) 
# this gives error 'could not find function "name<-'"

Затем я хочуназначьте уникальный идентификатор каждому элементу в моем списке dfs, чтобы у df1 и df 2 был столбец с именем «unique1», а у df3 был столбец с именем «unique2». Как я могу сделать это в автоматическом режиме?

* РЕДАКТИРОВАТЬ, чтобы уточнить. Это то, чего я хочу достичь в конце, ассоциируя каждый оригинальный df с уникальным идентификатором, как в:

dfs[[1]]$unique_df <- 'unique_1'
dfs[[2]]$unique_df <- 'unique_1'
dfs[[3]]$unique_df <- 'unique_2'

df

$df1
    a  b  c unique_df
1   1  2  3  unique_1
2   2  3  4  unique_1
3   3  4  5  unique_1
4   4  5  6  unique_1
5   5  6  7  unique_1
6   6  7  8  unique_1
7   7  8  9  unique_1
8   8  9 10  unique_1
9   9 10 11  unique_1
10 10 11 12  unique_1

$df2
    a  b  c unique_df
1   1  2  3  unique_1
2   2  3  4  unique_1
3   3  4  5  unique_1
4   4  5  6  unique_1
5   5  6  7  unique_1
6   6  7  8  unique_1
7   7  8  9  unique_1
8   8  9 10  unique_1
9   9 10 11  unique_1
10 10 11 12  unique_1

$df3
    b  a  c unique_df
1   2  1  3  unique_2
2   3  2  4  unique_2
3   4  3  5  unique_2
4   5  4  6  unique_2
5   6  5  7  unique_2
6   7  6  8  unique_2
7   8  7  9  unique_2
8   9  8 10  unique_2
9  10  9 11  unique_2
10 11 10 12  unique_2

Ответы [ 3 ]

2 голосов
/ 08 октября 2019
dfs<-unique(dfs)
names(dfs) <- c(paste0('unique_', 1:length(unique(dfs)))) 
dfs

$unique_1
    a  b  c
1   1  2  3
2   2  3  4
3   3  4  5
4   4  5  6
5   5  6  7
6   6  7  8
7   7  8  9
8   8  9 10
9   9 10 11
10 10 11 12

$unique_2
    b  a  c
1   2  1  3
2   3  2  4
3   4  3  5
4   5  4  6
5   6  5  7
6   7  6  8
7   8  7  9
8   9  8 10
9  10  9 11
10 11 10 12
0 голосов
/ 08 октября 2019

Мы можем использовать match, чтобы получить индекс уникальных элементов и с помощью Map создать столбец в base R

Map(cbind,  dfs, unique_df = paste0("unique_", match(dfs, unique(dfs))))
#$df1
#    a  b  c unique_df
#1   1  2  3  unique_1
#2   2  3  4  unique_1
#3   3  4  5  unique_1
#4   4  5  6  unique_1
#5   5  6  7  unique_1
#6   6  7  8  unique_1
#7   7  8  9  unique_1
#8   8  9 10  unique_1
#9   9 10 11  unique_1
#10 10 11 12  unique_1

#$df2
#    a  b  c unique_df
#1   1  2  3  unique_1
#2   2  3  4  unique_1
#3   3  4  5  unique_1
#4   4  5  6  unique_1
#5   5  6  7  unique_1
#6   6  7  8  unique_1
#7   7  8  9  unique_1
#8   8  9 10  unique_1
#9   9 10 11  unique_1
#10 10 11 12  unique_1

#$df3
#    b  a  c unique_df
#1   2  1  3  unique_2
#2   3  2  4  unique_2
#3   4  3  5  unique_2
#4   5  4  6  unique_2
#5   6  5  7  unique_2
#6   7  6  8  unique_2
#7   8  7  9  unique_2
#8   9  8 10  unique_2
#9  10  9 11  unique_2
#10 11 10 12  unique_2
0 голосов
/ 08 октября 2019

Мы можем использовать lapply для итерации по unique_df и transform для добавления нового столбца

unique_df <- unique(dfs)

lapply(seq_along(unique_df), function(i) 
      transform(unique_df[[i]], unique_id = paste0("unique", i)))


#[[1]]
#    a  b  c unique_id
#1   1  2  3   unique1
#2   2  3  4   unique1
#3   3  4  5   unique1
#4   4  5  6   unique1
#5   5  6  7   unique1
#6   6  7  8   unique1
#7   7  8  9   unique1
#8   8  9 10   unique1
#9   9 10 11   unique1
#10 10 11 12   unique1

#[[2]]
#    b  a  c unique_id
#1   2  1  3   unique2
#2   3  2  4   unique2
#3   4  3  5   unique2
#4   5  4  6   unique2
#5   6  5  7   unique2
#6   7  6  8   unique2
#7   8  7  9   unique2
#8   9  8 10   unique2
#9  10  9 11   unique2
#10 11 10 12   unique2

Или tidyverse способом.

library(dplyr)
purrr::map(seq_along(unique_df), ~unique_df[[.x]] %>% mutate(unique_id = .x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...