#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 для оператора. Я предполагаю, что единственный способ сделать это — создать функцию и вернуть?