1
votes

Vérifier le nombre de colonnes différentes dans un bloc de données dans R

J'utilise R et j'ai un ensemble de données où chaque colonne est une unité de production et chaque ligne est une unité de temps. Chaque variable est une séquence de rotation des cultures appliquée à l'unité de production.

L'ensemble de données ressemble à ceci:

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

Je dois vérifier combien de ces colonnes (séquences de cultures) sont uniques, je ne peux pas le faire une par une (faire quelque chose comme land_use_1! = land_use_2, faire quelque chose comme land_use_1! = land_use_3, etc.) car il y a des centaines de colonnes dans l'ensemble de données.

J'ai essayé de utilisez cette commande

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      

mais elle renvoie le même nombre de colonnes de l'ensemble de données et ne détecte donc pas quelles colonnes sont identiques (je sais que certaines sont identiques, car j'ai vérifié en utilisant certaines d'entre eux).

Comment puis-je faire cela de manière efficace?

Merci


2 commentaires

Je m'attendais aux dimensions du dataframe avec uniquement les colonnes uniques pour voir combien de colonnes il avait. Je définis unique comme une séquence unique d'états dans la rotation des cultures (colonne).


Non, je souhaite sélectionner des colonnes uniques, car beaucoup d'entre elles sont dupliquées car elles ont les mêmes rotations de cultures (séquence d'états). Par exemple, si je fais land_use_1 == land_use_2, il renvoie TRUE car ils utilisent la même rotation, mais si je fais land_use_1 == land_use_6, il renvoie FALSE car les rotations sont différentes. Je veux compter le nombre de rotations de cultures différentes.


3 Réponses :


0
votes

vous pouvez utiliser la fonction data.table duplicate:

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
> 

ici un exemple reproductible:

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

DT$duplicated_rows<- duplicate(DT)


1 commentaires

Merci, il semble fonctionner avec la fonction "dupliqué" et la transposition de mon dataframe. Voici la commande DT%>% t ()%>% dupliqué ()%>% sum, avec cela je peux voir le nombre de colonnes dupliquées et donc combien de colonnes uniques sont.



0
votes

Voici une solution pour générer une liste des noms des colonnes uniques et le nombre total de colonnes uniques:

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 commentaires

0
votes

Use:

> 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

Ceci force le dataframe en une liste de colonnes, puis compte le nombre d'éléments uniques de la liste.

par exemple:

 unique(as.list(dataset))


2 commentaires

@Augusto Il compte le nombre de colonnes uniques. Je vais éditer l'exemple pour le rendre plus clair.


J'ai vérifié votre solution, exactement ce que je voulais, merci!