Применение пользовательских функций к списку фреймов данных в R с циклом lapply - PullRequest
0 голосов
/ 27 июня 2019

Я попытался зациклить список элементов df с помощью 3 пользовательских функций.Это работает, когда я запускаю каждый DF вручную, но применение lapply не удается.К вашему сведению: результат должен привести к «расширению» каждого набора данных, который я позже буду использовать для обрезки файла изображения.Текстовые файлы данных имеют расширение .swc, но это просто текстовые файлы.Когда я запускаю наборы данных через функции вручную, это работает.Затем я импортировал несколько файлов в список, который тоже работал.Тем не менее, когда я пытаюсь использовать lapply для запуска каждого элемента списка через функции, я получаю следующую ошибку

Вот реальная попытка применить lapply

result<-lapply(df_swc_list, fxn(x))

Практикуйте dfs для использования и импортав список

df_swc1 <- data.frame(V1 = c(1,2,3,4), V2 = c(17.2,17.2,18.2,18.2), 
V3=c(105.32,106.01,108.89,109.99), V4=c(3,4,4,6), V5=c(1,2,2,2), 
V6=c(7,7,7,7), V7=c(-1,0,1,2))
df_swc2 <- data.frame(V1 = c(1,2,3,4), V2 = c(17.2,17.2,18.2,18.2), 
V3=c(105.32,106.01,108.89,109.99), V4=c(5,5,4,5), V5=c(1,2,2,2), 
V6=c(7,7,7,7), V7=c(-1,0,1,2))
df_swc_list <- list(df_swc1,df_swc2)
df_swc_list_names<-c("control", "variable")
names(df_swc_list)<-gsub("\\.swc$", "",df_swc_list_names)

pythag.opp.leg<-function(Radius){
Diam<-Radius*2
opposite<-sqrt((Diam^2)/2)
opposite.rounded<-round(opposite)
box<-opposite.rounded/2
return(box)
}

swc.fxn <-function(df1){
box<- round(pythag.opp.leg(df1$Radius))
swc.box<- Map(function(a, b, c, d, e) data.frame(X = a:b, Y = c:d, Z = e), 
            df1$X-box, df1$X+box, df1$Y-box, df1$Y+box, df1$Z)
swc.box2<- purrr::map_df(swc.box, function(x) tidyr::expand(x, X, Y, Z))
return(swc.box2)
} 

swc_process_A<-function(x){
as.data.frame(x)->swc2
swc2[,2:6]->swc3
swc3$V2->swc3$Type
swc3$V3->swc3$X
swc3$V4->swc3$Y
swc3$V5->swc3$Z
swc3$V6->swc3$Radius
swc3[,6:10]->swc4
trunc(swc4$X)->swc4$X
trunc(swc4$Y)->swc4$Y
trunc(swc4$Z)->swc4$Z
swc4->swc5
as.data.frame((swc.fxn(swc5)))->expanded.swc.df2
return(expanded.swc.df2)
}

Попытка применить цикл lapply

`result<-lapply(df_swc_list, swc_process_A(x))`

Ожидаемый результат для df_swc1 (первый элемент df в списке)

str(expanded.swc.df)

data.frame ': 484 шт.из 3 переменных:

X: int 100 100 100 100 100 100 100 100 100 100 ...

Y: int -2 -1 0 1 2 3 4 5 6 7 ...

Z: num 1 1 1 1 1 1 1 1 1 1 ...

Фактическое сообщение об ошибке гласит Ошибка в

[. Data.frame` (swc3,,6:10): выбраны неопределенные столбцы

1 Ответ

0 голосов
/ 27 июня 2019

Время вызова должно быть lapply(df_swc_list, "swc_process_A")

...