2015-11-18 2 views
0

Через исследования и большую помощь от пользователей на этом сайте, я был в состоянии загрузить несколько файлов XLSX в R, так как отдельные dataframes и как единый объект, содержащий несколько dataframesКак применить код к одному объекту, содержащему множество фреймов данных?

(Folder="I:/Marcs_Discretinization_try_1/Attempt1/Actual Data/actualdata/" 
Files=list.files(path=Folder, pattern=".xlsx") 
x=sapply(paste0(Folder,Files), read.xlsx2, as.data.frame=T, sheetIndex=1, simplify=FALSE) 

с выше код, я могу вызовите отдельного пользователя df как x$~2015-B1-2OR.xlsx, но как бы я проследовал через каждый из этих объектов, и это более простой способ приблизиться к задаче, чем установить цикл for с тонны числовых кадров (~ 200)?

Пример данных, если я называю на объекте x:

$`I:/Marcs_Discretinization_try_1/Attempt1/Actual Data/actualdata/2015-X2-2OR.xlsx` 

    Year Day Tank depth.1 depth.2 mid.depth S 
1 2015 2OR X2 0.11 0.135 0.1225 4.1 
2 2015 2OR X2 0.135 0.16 0.1475 5.6 

$`I:/Marcs_Discretinization_try_1/Attempt1/Actual Data/actualdata/2015-X2-OR10.xlsx` 

    Year Day Tank depth.1 depth.2 mid.depth S 
1 2015 OR10 X2 0.075  0.1 0.0875 4.6 
2 2015 OR10 X2  0.1 0.125 0.1125 4.2 
3 2015 OR10 X2 0.125 0.16 0.1425 5.2 
4 2015 OR10 X2 0.16 0.175 0.1675 5.2 
5 2015 OR10 X2 0.175  0.2 0.1875 6.8 
6 2015 OR10 X2  0.2 0.225 0.2125 7.5 
7 2015 OR10 X2 0.225 0.25 0.2375 8.8 

Вы можете видеть, что есть несколько столбцов и строк в пределах каждого уровня x. Как я могу перебирать уровни x и вызывать конкретные столбцы?

Например, lapply(x, nrow) перечисляет строки каждого уровня, но что, если я хочу вернуть nrow конкретных столбцов?

+1

'lapply'? Кроме того, можете ли вы предоставить хотя бы пример? –

+0

, работая над созданием аналоговой структуры данных. – Dilliplaine33

+0

@RomanTsegelskyi, извините, но для меня потребуется много усилий для создания аналогичного набора данных (отсюда и мои вопросы об этом). Возможно, этот вопрос следует удалить, чтобы он не воспроизводился. – Dilliplaine33

ответ

1

Во-первых, я думаю, что это хорошая идея, чтобы упростить имена вашего x списка:

names(x) <- gsub("^I:/Marcs_Discretinization_try_1/Attempt1/Actual Data/actualdata/|\\.xlsx","",names(x)) 

Как ваши данные просто слишком сложным, я сделал список для работы с:

A <- structure(list(A1 = structure(list(x = structure(c(1L, 1L, 2L, 
3L, 2L), .Label = c("a", "b", "c"), class = "factor"), y = c(0.00840516341850162, 
0.970356883713976, 0.469053473789245, 0.847559429006651, 0.646102252649143 
)), .Names = c("x", "y"), row.names = c(NA, -5L), class = "data.frame"), 
    A2 = structure(list(x = structure(c(1L, 1L, 2L, 3L, 2L), .Label = c("a", 
    "b", "c"), class = "factor"), y = c(0.599587128963321, 0.390590411843732, 
    0.11197471502237, 0.824506989680231, 0.608971498440951)), .Names = c("x", 
    "y"), row.names = c(NA, -5L), class = "data.frame"), A3 = structure(list(
     x = structure(c(1L, 1L, 2L, 3L, 2L), .Label = c("a", 
     "b", "c"), class = "factor"), y = c(-2.61798606622622, 
     0.696978535260992, -0.758098875328806, -1.08656950056061, 
     1.3469375195447), z = c(0.346128243254498, 0.691243288572878, 
     0.285317465662956, 0.125597422709689, 0.0258157614152879 
     )), .Names = c("x", "y", "z"), row.names = c(NA, -5L), class = "data.frame")), .Names = c("A1", 
"A2", "A3")) 

Теперь, я думаю, вы можете использовать lapply практически для любой операции, которую вы хотите выполнить на каждом из фреймов данных:

# get the number of observations in each data frame 
lapply(A,nrow) 
    # produces number of rows of each data frame 

library(data.table) 
lapply(A,setDT) 
lapply(A, function(j) j[,sum(y),by=x][order(-V1)]) 
    # sums A[i]$y over each level in A[i]$x; with i being each data frame in A 

и почти все, что вы хотите сделать ...

Смежные вопросы