Функция List для выполнения нескольких вычислений в r - PullRequest
1 голос
/ 19 апреля 2020

Я недавно начал использовать R, и я благодарен SO-сообществу за помощь в создании более 100 столбцов (разделенных на минуты) данных, аналогичных приведенным ниже.

time1      pid    mlat mlong   malt m_time 
1 23:57:00 2A     434. 8347. 0.140  m_2357
2 23:57:00 2D     433. 8353. 0.0702 m_2357
3 23:57:00 3D     433. 8349. 0.0135 m_2357
4 23:57:00 4A     434. 8364. 0.147  m_2357
5 23:57:00 4B     433. 8351. 0.162  m_2357

Функция, представленная ниже, предоставляет решение для одного набора данных.

pd<- function(mtime){
dm <- data.frame(x=mtime$mlat, #dm = distance matrix
            y=mtime$mlong, 
            z=mtime$malt, 
            row.names= mtime$pid)
ed<- dist(dm) #em = euclidean distance
em <- as.matrix(ed) #em = euclidean matrix
em <- melt(em)[melt(upper.tri(em))$value,] 
names(em)<- c("pid","intercept", "distance") 
e_df <- as.data.frame(em)
e_df$distance <- round((e_df$distance/.0005399565), digits = 0)
e_df<- arrange(e_df,distance)
write.csv(e_df,"m_2357.csv")
}
pd(m_2357)

Создано в 2020-04-19 пакетом Представить (v0.3.0)

После создания и вложения тиблы в список (использующий m_time), наиболее близкий к решению этой проблемы, я пришел к следующему:

mylist2 <- lapply(mylist, function(x){
  dm <- data.frame(x=mylist[[i]][["mlat"]],
                   y=mylist[[i]][["mlong"]], 
                   z=mylist[[i]][["malt"]], 
                   row.names= mylist[[i]][["pid”]]) … 

Это дублирует одно правильное решение 180 раз, поэтому я думаю, что я близок (я также сохранен как значение в моем может ли это быть проблемой?). К сожалению, я не смог найти никаких примеров функций, выполняющих несколько вычислений для списка. После того, как я провел большую часть дня, играя с комбинациями, я решил обратиться за помощью.

Мой вопрос: после того, как я внесу данные в список, как мне написать функцию lapply для каждого тибля в списке ?

1 Ответ

1 голос
/ 19 апреля 2020

Нет необходимости расширять существующий код функции. Просто запустите свой список фреймов данных / tibbles непосредственно в вашу функцию с помощью lapply, например: output <- lapply(mylist, pd).

Однако ваша функция на данный момент выводит один жестко закодированный CSV с именем "m_2357.csv". Таким образом, все итерации заменят этот файл, оставив результаты последнего запуска в этом одном файле. Поэтому вам нужно сделать имя файла динамическим c, которое выглядит как ваш столбец m_time . Кроме того, рассмотрите возможность возврата фрейма данных, а не результата write.csv, который обычно NULL.

pd <- function(mtime){
  dm <- data.frame(x=mtime$mlat,
                   y=mtime$mlong, 
                   z=mtime$malt, 
                   row.names= mtime$pid)
  ...

  # DYNAMIC VARIABLE NAME
  write.csv(e_df, paste(mtime$m_time[1], ".csv")

  # RETURN ACTUAL DATA FRAME
  return(e_df)
}


new_df_list <- lapply(mylist, pd)

Кстати, если бы ваша первоначальная установка была один большой фрейм данных / таблица со всеми 180 столбиками, сложенными вместе со столбцом m_time , чтобы различать guish между наборами, вы могли бы запустить функцию с by (объектно-ориентированная оболочка tapply), передавая подмножества по столбцу m_time в функцию:

new_df_list <- by(my_master_data_frame, my_master_data_frame$m_time, pd)
...