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

У меня есть ряд фреймов данных, структурированных аналогично этому:

df <- data.frame(x = c('notes','year',1995:2005), y = c(NA,'value',11:21))  
df2 <- data.frame(x = c('notes','year',1995:2005), y = c(NA,'value',50:60))

Чтобы очистить их, я написал пользовательскую функцию с набором шагов очистки:

clean <- function(df){
  colnames(df) <- df[2,]
  df <- df[grep('^[0-9]{4}', df$year),]
  return(df)
}

Теперь я хотел бы поместить свои фреймы данных в список:

df_list <- list(df,df2)

и очистить их все сразу.Я пытался

lapply(df_list, clean)

и

for(df in df_list){
  clean(df)
}

Но с обоими методами я получаю сообщение об ошибке:

Error in df[2, ] : incorrect number of dimensions

В чем причина этой ошибки и как ее исправить?Мой подход к этой проблеме неверен?

1 Ответ

0 голосов
/ 31 мая 2018

Вы близки, но в коде есть одна проблема.Поскольку у вас есть текст в столбцах вашего информационного кадра, столбцы создаются как факторы, а не как символы.Таким образом, наименование столбца не дает ожидаемого результата.

#need to specify strings to factors as false
df <- data.frame(x = c('notes','year',1995:2005), y = c(NA,'value',11:21), stringsAsFactors = FALSE)  
df2 <- data.frame(x = c('notes','year',1995:2005), y = c(NA,'value',50:60), stringsAsFactors = FALSE)

clean <- function(df){
  colnames(df) <- df[2,]
  #need to specify the column to select the rows
  df <- df[grep('^[0-9]{4}', df$year),]

  #convert the columns to numeric values
    df[, 1:ncol(df)] <- apply(df[, 1:ncol(df)], 2, as.numeric)

  return(df)
}

df_list <- list(df,df2)
lapply(df_list, clean)
...