【问题标题】:R - Programming: How to loop through a list of dataframes and manipulate specific columns within each?R - 编程:如何遍历数据框列表并操作每个列表中的特定列?
【发布时间】:2013-12-03 00:10:17
【问题描述】:

所以我有三个数据框,每个有 14 列。

iowa <- data.frame() #Has 14 columns; let's say 600 records
maine <- data.frame() #Has same 14 columns; let's say 700 records
texas <- data.frame() #Has same 14 columns; let's say 900 records

我将这些数据框放在一个列表中,

state_List <- list(iowa, maine, texas)

然后,我想将 state_List 中每个数据框中的两列(称为“State_Date”和“US_Date”)更改为日期格式,并且我想将除一列之外的所有列更改为因子。我写了以下内容:

state_List <- lapply(state_List,
                     function(x){
                                 x$State_Date <- as.Date(x$State_Date, format = "%m/%d/%Y")
                                 x$US_Date <- as.Date(x$US_Date, format = "%m/%d/%Y")
                                 x[, c(1:7, 9:14)] <- as.factor(x[, c(1:7, 9:14)]
                                 }
                     )

我收到的错误是

Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Have you called 'sort' on a list?

这个错误是由于 as.factor 部分造成的。

但是,如果我摆脱对 lapply 中调用的函数的最后评估,而只保留更改日期字段类的两个,我得到的是:

  1. 其中包含的数据帧的 3 个名称丢失的列表
  2. 列表中的每个数据框,或者我应该说列表中数据框的每个槽现在都填充了该州的 US_Date 列。

我想要的是:

  1. 包含 3 个数据框的列表(保留数据框的名称)
  2. 在每个数据帧中,State_Date 和 US_Date 这两个字段的日期已被格式化
  3. 除第 8 列之外的所有列都将格式化为因子

感谢您的帮助!

** 下面的正确代码显示了根据响应我应该做什么:

state_List <- list(iowa = iowa, maine = maine, texas = texas)
state_List <- lapply(state_List,
                     function(X){
                                 x$State_Date <- as.Date(x$State_Date, format = "%m/%d/%Y")
                                 x$US_Date <- as.Date(x$US_Date, format = "%m/%d/%Y")
                                 x[, c(1:7, 9:14)] <- lapply( x[, c(1:7, 9:14)] , factor)
                                 return(x)
                                 }
                    )

【问题讨论】:

  • 这个问题写得很好,展示了你的尝试。感谢那。与其在问题中发布最终解决方案(因为这可能会让读者感到困惑),不如将其作为单独的答案发布。

标签: r list lapply


【解决方案1】:

函数里面的第三行应该是:

x[, c(1:7, 9:14)] <- lapply( x[, c(1:7, 9:14)] , factor)

最后你应该return(x)

【讨论】:

  • 首先,这是一个出色的答案。效果很好。现在,如果我想在列表中保留数据框的名称,我是否只需要一个向量来保存它们,我可以在全局 lapply 函数之后分配它们?也就是说,我必须将数据框的名称保存在列表中,以便在 lapply 函数之后重新分配它们,还是有办法保留 x 的名称?我必须输入 names(x)
  • 我希望 stateList 的名称在 &lt;-lapply() 之后是相同的。你是说名字丢了? (并且不要费心去发现函数中的名字是什么。这是一个没有希望的任务。)
  • 他们是。以下是返回的内容: >names(state_List) >NULL 无法确定如何在 cmets 中键入代码
  • 嗯......他们一开始就没有名字吗?
  • 绝对正确!我应该写清单(爱荷华州=爱荷华州等...)。谢谢!我很感激你对那个的耐心。你发现它的速度真是太神奇了。我可能已经花了一个小时,忽略了一个假设)。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
相关资源
最近更新 更多