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
3 Réponses :
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)
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.
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
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))
@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!
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.