不知道如何问这个,但我会试一试:
我有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)
答案 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
>