Проверьте количество различных столбцов в фрейме данных в R - PullRequest
1 голос
/ 09 марта 2020

Я использую R и у меня есть набор данных, где каждый столбец является производственной единицей, а каждая строка - единицей времени. Каждая переменная представляет собой последовательность севооборота, применяемую к производственной единице.

Набор данных выглядит следующим образом:

land_use_1 land_use_2 land_use_3 land_use_4 land_use_5 land_use_6
 <chr>      <chr>      <chr>      <chr>      <chr>      <chr>     
1 PAST       PAST       PAST       PAST       SOY       PAST      
2 PAST       PAST       PAST       PAST       SOY       PAST      
3 PAST       PAST       PAST       PAST       PAST      PAST      
4 PAST       PAST       PAST       PAST       PAST      SOY       
5 PAST       PAST       PAST       PAST       CORN      SOY      
6 PAST       PAST       PAST       PAST       CORN      PAST      

Мне нужно проверить, сколько из этих столбцов (последовательностей кадрирования) являются уникальными, я не могу сделать это один за другим (делая что-то вроде land_use_1! = land_use_2, делая что-то вроде land_use_1! = land_use_3 и т. д. c), потому что в наборе данных есть сотни столбцов.

Я пытался использовать эта команда

dataset %>% unique(, MARGIN=2) %>% dim()

, но возвращает то же количество столбцов набора данных и, следовательно, не определяет, какие столбцы идентичны (я знаю, что некоторые идентичны, потому что я проверил, используя некоторые из них).

Как я могу сделать это эффективным способом?

Спасибо

Ответы [ 3 ]

1 голос
/ 09 марта 2020

Вот решение для генерации списка имен уникальных столбцов и общего количества уникальных столбцов:

library(tidyverse)

df <- data.frame(land_use_1 = rep("PAST", 6),
                 land_use_2 = rep("PAST", 6),
                 land_use_3 = rep("PAST", 6),
                 land_use_4 = rep("PAST", 6),
                 land_use_5 = c("SOY", "SOY", "PAST", "PAST", "CORN", "CORN"),
                 land_use_6 = c("PAST", "PAST", "PAST", "SOY", "SOY", "PAST"))

unique_vars <- data.frame(t(df)) %>%
  rownames_to_column() %>%
  distinct_at(vars(-rowname), .keep_all = T)

unique_vars$rowname
# [1] [1] "land_use_1" "land_use_5" "land_use_6"

length(unique_vars$rowname)
# [1] 3
0 голосов
/ 09 марта 2020

Использование:

 unique(as.list(dataset))

Приводит информационный кадр в список столбцов, затем подсчитывает количество уникальных элементов списка.

Например:

> d <- data.frame(a=c(1,1,0) , b=c(1,1,0), c=c(1,0,1))
> unique(as.list(d))
[[1]]
[1] 1 1 0

[[2]]
[1] 1 0 1

> length(unique(as.list(d)))
[1] 2
0 голосов
/ 09 марта 2020

вы можете использовать data.table fuction duplicated:

library(data.table)
DT<-data.table(yourdataframe)

DT$duplicated_rows<- duplicate(DT)

здесь воспроизводимый пример:

DT <- data.table(A = rep(1:3, each=4), B = rep(1:4, each=3),
                  C = rep(1:2, 6), key = "A,B")
DT
    A B C
 1: 1 1 1
 2: 1 1 2
 3: 1 1 1
 4: 1 2 2
 5: 2 2 1
 6: 2 2 2
 7: 2 3 1
 8: 2 3 2
 9: 3 3 1
10: 3 4 2
11: 3 4 1
12: 3 4 2
duplicated(DT)
 [1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
> 
...