0

所以我在一个列表对象中有一堆数据框。框架的组织方式如

ID     Category    Value
2323   Friend      23.40
3434   Foe         -4.00

我按照这个主题将它们列入了一个列表。我还可以在它们上运行简单的函数,如本主题所示。

现在我正在尝试使用 lapply运行条件函数,但遇到了麻烦。在某些表中,“ID”列具有不同的名称(例如“recnum”),我需要告诉 lapply 遍历每个数据框,检查是否有名为“recnum”的列,并将其名称更改为“ ID',如

colnr <- which(names(x) == "recnum"
if (length(colnr > 0)) {names(x)[colnr] <- "ID"}

但是我在本地范围内遇到了麻烦,谁知道呢。有任何想法吗?

4

2 回答 2

4

使用rename函数plyr; 它按名称重命名,而不是位置:

x <- data.frame(ID = 1:2,z=1:2)
y <- data.frame('recnum' = 1:2,z=3:4)

.list <- list(x,y)
library(plyr)
lapply(.list, rename, replace = c('recnum' = 'ID'))

[[1]]
  ID z
1  1 1
2  2 2

[[2]]
  ID z
1  1 3
2  2 4

您的原始代码工作正常:

foo <- function(x){
  colnr <- which(names(x) == "recnum")

  if (length(colnr > 0)) {names(x)[colnr] <- "ID"}
  x
}
.list <- list(x,y)
lapply(.list, foo)

不知道你的问题是什么。

于 2012-08-30T06:57:31.800 回答
1

如果您查看 mnel 答案的第二部分,您可以看到该函数的foo计算结果x是其最后一个表达式。否则,如果您尝试直接从传递给的匿名函数中更改列表中 data.frames 的名称lapply,它可能无法正常工作。

作为替代方案,您可以使用gsub并避免加载额外的包(虽然plyr是一个不错的包):

xx <- list(data.frame("recnum" = 1:3, "recnum2" = 1:3),
  data.frame("ID" = 4:6, "hat" = 4:6))

lapply(xx, function(x){ 
  names(x) <- gsub("^recnum$", "ID", names(x))
  return(x)
})
# [[1]]
#   ID recnum2
# 1  1       1
# 2  2       2
# 3  3       3

# [[2]]
#   ID hat
# 1  4   4
# 2  5   5
# 3  6   6
于 2012-08-30T07:43:36.600 回答