【问题标题】:Apply a function to rows inside multiple data.frames将函数应用于多个 data.frames 中的行
【发布时间】:2012-06-19 15:19:26
【问题描述】:

不知道怎么问,但我会试一试:

我有 20 个从 MS Access 导入的数据帧(例如 2006_1、2006_2、2007_1、2007_2...)。

每个 data.frame 有 10 列和大约 300 万行。

每个 data.frame 中的第一列命名为 secuityName,这是一个股票代码列表,后面跟着一些标签。

我想在 20 个 data.frame 中的每一个中将 SecurityName 列中的每一行都大写。

结构如下:

2006_1

> **SecurityName**   **...**
> AAPL abcdef        **...**
> MSFT abcdef        **...**

2006_2

> **SecurityName**   **...**
> AAPL abcdef        **...**
> MSFT abcdef        **...**

我希望每个人看起来像这样:

2006_1

> **SecurityName**   **...**
> AAPL ABCDEF        **...**
> MSFT ABCDEF        **...**

我有一个名为 *Raw_data_vector* 的向量,其中包含所有 data.frame 名称

原始数据向量

> 2006_1
> 2006_2
> 2007_1
> 2007_2
> ...

我尝试使用 lapply 但无法使用:

lapply(1:length(Raw_data_vector), function(x) toupper(get(x)[,1]),Raw_data_vector)

【问题讨论】:

  • 您可以使用ls 的模式参数获取data.frame 名称,但是,使用数字命名的变量通常会带来更多的麻烦而不是好处。在继续之前,您可能需要考虑更改他们的名字。
  • @user1399173 考虑到数据的类型和大小,您可能会发现包data.table 更方便、更快捷。最好从用户评论开始,然后是演示文稿。

标签: r lapply


【解决方案1】:

这应该可以帮助您入门。我使用了data.frames,其中的字符以他们的名字开头,所以我不会做任何有趣的事情。

oh6_1 <- data.frame(SecurityName=letters[1:20], v=1:20)
oh6_2 <- oh6_1

out <- lapply(ls(pattern = 'oh[0-9]_*'), 
              function(x) {
                df <- get(x)
                df[, 1] <- toupper(df[, 1])  
                return(df)
              })

根据 cmets:

根据 data.frames 的名称,您需要将 pattern 参数更改为 ls。此外,R 并不会(在大多数情况下)原地改变事物,而是创建一个新事物。

您将其视为控制台的输出,因为它没有分配给任何东西!而是使用out &lt;- llply(ls(...)...) 之类的东西。然后检查out。它将是您提供的附加列的数据框列表。您可以使用?str 检查R 对象。

最后,这个对象列表概念是处理许多相似(或相同)事物时的常见结果。从这里很容易继续执行您想要的任何过程,接受而不是在类似 for 循环中调用 function(data.frame),您可以调用 lapply(list of data frames, function)

...肯定像泥巴一样干净。

如果一定要对已有的data.frame做小写操作,可以使用总是吓人的assign函数:

myfun <- function(X) {
  df <- get(x)
  df[, 1] <- toupper(df[, 1])
  assign(x, df, .GlobalEnv)
  return(NULL)
}

lapply(ls(), myfun)

现在查看您的 data.frames。

> oh6_1
   SecurityName  v
1             A  1
2             B  2
3             C  3
4             D  4
5             E  5
6             F  6
7             G  7
8             H  8
9             I  9
10            J 10
11            K 11
12            L 12
13            M 13
14            N 14
15            O 15
16            P 16
17            Q 17
18            R 18
19            S 19
20            T 20
> 

【讨论】:

  • 贾斯汀,我只是尝试实施您的解决方案,但 toupper() 没有留下来。它正在向控制台输出正确的结果,但原始结果没有被覆盖(即,我正在 RStudio 中查看我的工作区,当我查看()它时它是同一个文件)。有什么建议吗?
  • 另外,它只是将第一个 data.frame 输出到控制台——不是全部三个。我现在比以往任何时候都更加困惑......
  • 谢谢你——我真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2020-08-11
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多