R столбцов фрейма данных в списке в инструкции for

#r #list #for-loop #dataframe

#r #Список #цикл for #фрейм данных

Вопрос:

У меня есть несколько файлов .csv, которые имеют одинаковый формат, одинаковые имена столбцов и т.д.

Я хочу выполнить некоторые операции над столбцами, а затем вернуть операции после каждого цикла for. Вот некоторый повторяющийся код:

 df1 <- data.frame(x= (0:9), y= (10:19))
df2 <- data.frame(x= (20:29), y=(30:39))

listy <- list(df1, df2)

avg <- 0

filenames<- c("df1", "df2")
filenumbers<-seq(listy)
b <- 0
for(filenumber in filenumbers){ b <- b 1
allDM <- as.data.frame(filenames[filenumber],
                                header=TRUE)
allDM <- data.frame(
  pred= filenames[filenumber]$x,
  actual= filenames[filenumber]$y
)

allDM$pa <- allDM$pred-allDM$actual

avg <- mean(allDM$pa)

return(avg)

}
  

Здесь не нравится использовать функцию $ .

Ошибка: ошибка в именах файлов [filenumber] $ x: оператор $ недопустим для атомарных векторов

Приветствия,

Ответ №1:

filenames[filenumber]

является просто (атомарным) символьным объектом, т.е.

 [1] "df1"
  

или

 [1] "df2"
  

таким образом, не имело бы смысла использовать $ его.

Вы можете исправить это, используя get() :

 for(filenumber in filenumbers){ 

  b <- b   1

  allDM <- as.data.frame(filenames[filenumber],
                         header=TRUE)
  tmp <- get(filenames[filenumber]) 

  allDM <- data.frame(
    pred   = tmp$x,
    actual = tmp$y
  )

  allDM$pa <- allDM$pred-allDM$actual
  avg      <- mean(allDM$pa)


}
  

Обратите внимание, что я также исключил return(avg) , потому что это не функция, которую вы не можете использовать return() , но вам все равно это не нужно. avg все еще создается.

Комментарии:

1. Спасибо, Hack-R! Я хочу взять avg и некоторые другие операции из цикла for и создать базу данных этих переменных и row = each для оператора. Я предполагаю, что единственный способ сделать это — создать функцию и вернуть?