применить аналогичную переменную к нескольким наборам данных в r - PullRequest
0 голосов
/ 22 мая 2018

У меня есть 6 данных, названных от dat1 до dat6, я хочу добавить переменную область и пометить их подобным образом, например:

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")

Как мне написать этот код более кратким способом?используя apply или for-loop?Спасибо !!

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Как насчет этого (при условии, что все ваши элементы начинаются с dat и заканчиваются строкой уникального идентификатора):

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 голосов
/ 23 мая 2018

Один из вариантов - использовать функции get и assign в for-loop.

Пример данных:

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

Применить for-loop:

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

Проверить результаты:

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
0 голосов
/ 23 мая 2018

Сохраните все фреймы данных в списке, затем используйте 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

Тогда будет проще выполнять повторяющиеся операции.Прокрутите список, добавьте регион столбец:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...