【问题标题】:Apply a user defined function to a list of data frames将用户定义的函数应用于数据框列表
【发布时间】:2018-11-10 20:19:42
【问题描述】:

我有一系列与此类似的数据框:

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

是什么导致了这个错误,我该如何解决?我解决这个问题的方法有问题吗?

【问题讨论】:

  • 您没有列 df$year。您的数据创建代码错误,请查看使用该代码创建的内容并更正它。
  • 在数据清理功能中,列名设置为数据框中的第二行。第二行包含字符串“year”和“value”。当您将单个 df 传递给函数时,该函数可以正常工作,但是当我尝试循环遍历它或将其应用于列表时会出错。
  • df &lt;- df[grep('^[0-9]{4}', df$year),]中不需要逗号吗?
  • 你说得对,我的错字。不幸的是,这不是问题的原因。

标签: r list loops lapply data-cleaning


【解决方案1】:

您很接近,但代码中存在一个问题。由于您的数据框列中有文本,因此这些列被创建为因子而不是字符。因此,您的列命名不能提供预期的结果。

#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)

【讨论】:

  • 感谢您的回复!这适用于我的示例数据集,但我似乎无法将其应用于我的实际数据。我认为是什么导致了这个问题:大约有 20 列而不是 2 列,是否有一种优雅的方法可以将所有列转换为数字而不是调用每一列并使用 as.numeric() 函数?我尝试将apply(df,2,as.numeric) 添加到函数中,但它似乎没有成功。
  • @Oct,见上面的编辑,你需要在apply语句和return中指定需要转换的列。对于所有列:df[, 1:ncol(df)]
猜你喜欢
  • 2021-09-06
  • 1970-01-01
  • 2020-10-01
  • 2021-09-14
  • 1970-01-01
  • 2020-10-28
  • 2020-11-11
  • 2021-03-20
  • 2023-03-06
相关资源
最近更新 更多