在lapply

时间:2016-06-24 20:20:03

标签: r lapply

我有一个关于lapply的非常简单的问题。我正在从STATA过渡到R,我认为有一些非常基本的概念,我没有在R中循环。但是我整个下午都在阅读它并且无法找到一个合理的方法来做这个非常简单的事情

我有三个数据框df1,df2和df3,它们都具有相同的列名,顺序相同等。

我想一次重命名他们的列。

我把数据框放在一个列表中:

dflist <- list(df1, df2, df3)

我希望新名称是什么:

varlist <- c("newname1", "newname2", "newname3")

编写一个函数,用varlist中的名称替换名称,并在数据框上填充它

ChangeNames <- function(x) {
  names(x) <- varlist 
  return(x)
}

dflist <- lapply(dflist, ChangeNames)

因此,据我所知,R已经更改了我放在列表中的数据帧副本的名称,但不更改原始数据帧本身的名称。我希望重命名数据框本身,而不是列表中的元素(列在列表中)。

现在,我可以去

df1 <- as.data.frame(dflist[1])
df2 <- as.data.frame(dflist[2])
df2 <- as.data.frame(dflist[3])

但这看起来很奇怪。你需要一个循环来取回循环的元素?

基本上:一旦你把一些数据框放在一个列表中并通过lapply运行你的函数,你怎么把它们从列表中取出来,而不是从方块一开始?

2 个答案:

答案 0 :(得分:1)

如果您只是想更改名称,那么在R中这并不太难。请记住,可以按顺序应用赋值运算符foreach (Wall.Name thiswallsname in WallsList) {Debug.Log(thiswallsname);} }//end of class 。因此:

<-

答案 1 :(得分:0)

我不确定我是否理解正确,您是否要重命名数据框的列或包含数据框的列表组件?

如果是第一个,请在询问之前一直搜索,问题已经被问到here

因此,如果列表中包含更多数据框,您可以轻松完成的任务是:

# Creating some sample data first
> dflist <- list(df1 = data.frame(a = 1:3, b = 2:4, c = 3:5),
+ df2 = data.frame(a = 4:6, b = 5:7, c = 6:8),
+ df3 = data.frame(a = 7:9, b = 8:10, c = 9:11))

# See how it looks like
> dflist
    $df1
  a b c
1 1 2 3
2 2 3 4
3 3 4 5

$df2
  a b c
1 4 5 6
2 5 6 7
3 6 7 8

$df3
  a  b  c
1 7  8  9
2 8  9 10
3 9 10 11

# And do the trick
> dflist <- lapply(dflist, setNames, nm = c("newname1", "newname2", "newname3"))

# See how it looks now
> dflist

$df1
  newname1 newname2 newname3
1        1        2        3
2        2        3        4
3        3        4        5

$df2
  newname1 newname2 newname3
1        4        5        6
2        5        6        7
3        6        7        8

$df3
  newname1 newname2 newname3
1        7        8        9
2        8        9       10
3        9       10       11

因此,对于每个数据框,名称已从abc更改为newname1newname2newname3列表。

如果是第二个,你可以这样做:

> names(dflist) <- c("newname1", "newname2", "newname3")