Как я могу сказать R применить функции к нескольким данным? - PullRequest
0 голосов
/ 13 марта 2019

Я довольно долго собирал эту работу, пробовал разные подходы, но не смог.

я хочу применить следующие 4 функции к 30 различным данным (data1,2,3, ... data30) внутри цикла for или вообще к R. Эти наборы данных имеют одинаковые (10) номера столбцов и разныестрок.

Это код, который я написал для первых данных (data1).Это работает хорошо.

for(i in 1:nrow(data1)){
  data1$simp <-diversity(data1$sp, "simpson")
  data1$shan <-diversity(data1$sp, "shannon")
  data1$E <- E(data1$sp)
  data1$D <- D(data1$sp)
}

Я хочу применить этот код для других 29 данных, чтобы не повторять процесс 29 раз.

Следующий код, что я пытаюсь сделать сейчас.Но все еще не прав.

data.list <- list(data1, data2,data3,data4,data5)
for(i in data.list){
  data2 <- NULL
  i$simp <-diversity(i$sp, "simpson")
  i$shan <-diversity(i$sp, "shannon")
  i$E <- E(i$sp)
  i$D <- D(i$sp)
  data2 <- rbind(data2, i)
  print(data2)
}

Итак, я хочу спросить, как я могу сказать R применить функции к другим 29 данным?

Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 13 марта 2019

Я предполагаю, что ваши data1, ..., dataN - это файлы, хранящиеся в каталоге, и вы читаете их по одному.Кроме того, они имеют одинаковый заголовок.

Что вы можете сделать, это импортировать их по одному, а затем выполнять нужные операции, как вы упомянули:

files <- list.files(directoryPath) #maybe you can grep() some specific files
for (f in files){
  data <- read.table(f) #choose header, sep and so on...
  for(i in 1:nrow(data)){
    data$simp <-diversity(data$sp, "simpson")
    data$shan <-diversity(data$sp, "shannon")
    data$E <- E(data$sp)
    data$D <- D(data$sp)
  }
}

будьте осторожны сдолжен находиться в рабочем каталоге или вы должны добавить путь к имени файла при чтении таблиц (т.е. paste(path, f, sep=""))

0 голосов
/ 13 марта 2019

Если я понимаю вопрос, то в конечном итоге вы спрашиваете о своей переменной 'data2' и как объединить их все вместе? Я думаю, проблема в том, что вы устанавливаете data2 <- NULL с каждой итерацией цикла. Предлагаемое ниже решение выводит это определение за пределы цикла, и вызов rbind() должен теперь добавить все ваши фреймы данных вместе, чтобы получить объединенный набор данных.

data.list <- list(data1, data2,data3,data4,data5) #all 29 can go here
data2 <- NULL
for(i in data.list){

  i$simp <-diversity(i$sp, "simpson")
  i$shan <-diversity(i$sp, "shannon")
  i$E <- E(i$sp)
  i$D <- D(i$sp)
  data2 <- rbind(data2, i)
}
print(data2)
0 голосов
/ 13 марта 2019

Вы можете сделать это с помощью Map.

fun <- function(DF){
  for(i in 1:nrow(DF)){
    DF$simp <-diversity(DF$sp, "simpson")
    DF$shan <-diversity(DF$sp, "shannon")
    DF$E <- E(DF$sp)
    DF$D <- D(DF$sp)
  }
  DF
}

result.list <- Map(fun, data.list)

Или, если вы не хотите иметь функцию fun в .GlobalEnv, с lapply.

result.list <- lapply(data.list, function(DF){
  for(i in 1:nrow(DF)){
    DF$simp <-diversity(DF$sp, "simpson")
    DF$shan <-diversity(DF$sp, "shannon")
    DF$E <- E(DF$sp)
    DF$D <- D(DF$sp)
  }
  DF
})
0 голосов
/ 13 марта 2019

Есть много вариантов, вот один, использующий только базовые функции:

data.list <- list(data1, data2, data3, data4, data5)
changed_data <- lapply(data.list, function(my_data) {
    my_data$simp <-diversity(my_data$sp, "simpson")
    my_data$shan <-diversity(my_data$sp, "shannon")
    my_data$E <- E(my_data$sp)
    my_data$D <- D(my_data$sp)
    my_data})
...