J'ai 6 données nommées de dat1 à dat6, je veux ajouter une région variable et les étiqueter de la même manière, comme ceci:

dat1$region <- paste("NE-1")
dat2$region <- paste("NE-2")
dat3$region <- paste("NE-3")
dat4$region <- paste("NE-4")
dat5$region <- paste("NE-5")

Comment puis-je écrire ce code de manière plus concise? en utilisant apply ou for-loop? Merci!!

1
mandy 22 mai 2018 à 23:57

3 réponses

Meilleure réponse

Une option consiste à utiliser les fonctions get et assign dans un for-loop.

Exemples de données:

dat1 <- data.frame(id=1:4, region = letters[1:4])
dat2 <- data.frame(id=5:8, region = letters[5:8])
dat3 <- data.frame(id=9:12, region = letters[9:12])
dat4 <- data.frame(id=13:16, region = letters[13:16])
dat5 <- data.frame(id=17:20, region = letters[17:20])

dat1
#   id region
# 1  1      a
# 2  2      b
# 3  3      c
# 4  4      d

Appliquer for-loop:

for(i in 1:5){
  name = paste("dat",i,sep="")
  temp <- get(name)
  temp$region = paste("NE",i,sep = "-")
  assign(name, temp)
}

Vérifier les résultats:

dat1
#   id region
# 1  1   NE-1
# 2  2   NE-1
# 3  3   NE-1
# 4  4   NE-1


dat5
#   id region
# 1 17   NE-5
# 2 18   NE-5
# 3 19   NE-5
# 4 20   NE-5
1
MKR 22 mai 2018 à 21:31

Conservez tous les dataframes dans une liste puis utilisez lapply :

# example dataframes
dat1 <- cars[1:2, ]
dat2 <- cars[3:4, ]
dat3 <- cars[5:6, ]

myList <- list(dat1, dat2, dat3)
# myList 
# [[1]]
#   speed dist
# 1     4    2
# 2     4   10
# 
# [[2]]
#   speed dist
# 3     7    4
# 4     7   22
# 
# [[3]]
#   speed dist
# 5     8   16
# 6     9   10

Ensuite, il est plus facile de faire des opérations répétitives. Parcourez la liste, ajoutez la colonne region :

res <- lapply(seq_along(myList), function(i){
  x <- myList[[ i ]]
  x$region <- paste0("NE-", i)
  x
})

res
# [[1]]
#   speed dist region
# 1     4    2   NE-1
# 2     4   10   NE-1
# 
# [[2]]
#   speed dist region
# 3     7    4   NE-2
# 4     7   22   NE-2
# 
# [[3]]
#   speed dist region
# 5     8   16   NE-3
# 6     9   10   NE-3
1
zx8754 22 mai 2018 à 21:15

Que diriez-vous de cela (en supposant que tous vos éléments commencent par dat et se terminent par une chaîne d'identifiant unique):

dat_names <- ls()[grepl("^dat", ls())]
dat_ID <- sapply(dat_names, function(d) gsub("dat", "", d))
for(d in 1:length(dat_names)) {
  dat_names[[d]]$region <- paste("NE-", dat_ID[d], sep="")
}
0
J. Win. 22 mai 2018 à 21:21