1

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

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

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

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

我想SecurityName在 20 个 data.frames 中的每一个中对列中的每一行进行大写。

结构如下:

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

1 回答 1

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

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

... 可以肯定的是,像泥一样清澈。

如果一定要对已有的data.frame做小写操作,可以使用always很吓人的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
> 
于 2012-06-19T15:32:52.210 回答