首页 > 解决方案 > 参考函数 r 中的数据框

问题描述

我正在尝试清理许多具有相同初始结构的数据帧。因此,我想:

  1. 编写代码以清理一个数据帧
  2. 为该代码编写一个函数
  3. 创建数据框列表
  4. 使用 map(purr 包)迭代我在数据框列表上创建的函数。

我遇到的问题是如何让函数更新数据框,以便我将干净的数据框保存为对象。

为了明确这一点:

创建一个示例数据框(所有数据框具有相同的格式):

> df <- data.frame(X.1 = c("last.update", "trial.a", c(4,5,7)), X.2 = c("12/01/16", "trial.b", c(3,5,6)), stringsAsFactors = F)
> df
          X.1      X.2
1 last.update 12/01/16
2     trial.a  trial.b
3           4        3
4           5        5
5           7        6

编写代码以生成干净的数据帧:

> colnames(df) <- df[2, ]
> df <- df[-c(1,2), ]
> df
  trial.a trial.b
3       4       3
4       5       5
5       7       6

所以我写了一个函数:

scrub <- function(x) {
  colnames(x) <- x[2, ]
  x <- x[-c(1,2), ]
}

如果我将擦洗应用于原始数据框,则不会发生任何事情:

> df <- data.frame(X.1 = c("last.update", "trial.a", c(4,5,7)), X.2 = c("12/01/16", "trial.b", c(3,5,6)), stringsAsFactors = F)
> scrub <- function(x) {
+   colnames(x) <- x[2, ]
+   x <- x[-c(1,2), ]
+ }
> scrub(df)
> df
          X.1      X.2
1 last.update 12/01/16
2     trial.a  trial.b
3           4        3
4           5        5
5           7        6

相反,为了获得干净的数据帧,我必须重新编写函数,使其不引用主体第二行中的 x,然后我必须在数据帧上调用函数并将结果分配给对象:

> scrub <- function(x) {
+   colnames(x) <- x[2, ]
+   x[-c(1,2), ]
+ }
> df <- scrub(df)
> df
  trial.a trial.b
3       4       3
4       5       5
5       7       6

那么问题是我想在多个数据帧上映射(purr 包)这个函数。这意味着我需要该函数来输出更新的数据帧。如果引用正文第二行中的数据框不起作用,我该如何实现。

我确信这是一个简单的问题,但我似乎无法解决。

注意:实际上,清理这些数据帧的代码将比更改列名和删除不相关的行做更多的事情。

标签: rfunctiondataframe

解决方案


让我们构建一个scrub带有显式返回的漂亮函数:

scrub <- function(x) {
  colnames(x) <- x[2, ]
  x <- x[-c(1,2), ]
  return(x)
}

证明它有效:

> df
          X.1      X.2
1 last.update 12/01/16
2     trial.a  trial.b
3           4        3
4           5        5
5           7        6
> scrub(df)
  trial.a trial.b
3       4       3
4       5       5
5       7       6

上面我们看到了原始数据,并且scrub(df)删除了两行。但是, 的输出scrub(df)尚未保存。df没有被修改,因为我们没有scrub(df)<-.

接下来我们将展示原始数据仍然存在于df. 然后我们将清理后的版本分配回df,覆盖原始版本,并显示df现在已修改:

> df
          X.1      X.2
1 last.update 12/01/16
2     trial.a  trial.b
3           4        3
4           5        5
5           7        6
> df <- scrub(df)   ## assign the result of scrub(df)
> df
  trial.a trial.b
3       4       3
4       5       5
5       7       6

现在df已被擦洗,结果已保存。


推荐阅读