将函数应用于多个data.frames中的行

时间:2012-06-19 15:19:26

标签: r lapply

不知道如何问这个,但我会试一试:

我有20个从MS Access导入的data.frames(例如2006_1,2006_2,2007_1,2007_2,...)。

每个data.frame有10列,大约3百万行。

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

我想在20个data.frames中的每一个中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名称

Raw_data_vector

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

我曾尝试使用 lapply ,但无法让它工作:

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

1 个答案:

答案 0 :(得分: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)
              })

根据评论:

根据您的data.frames的名称,您需要将pattern参数更改为ls。此外,R不会改变现状(大部分),而是创建一个新的。

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

最后,当处理许多相似(或相同)的事物时,这个对象概念列表是一个常见的结果。从这里继续做你想要的任何过程都很容易,接受而不是像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
>