替代substitute()或names()以保持数据框名​​称与lapply

时间:2015-11-10 19:55:15

标签: r

设置:我读过一堆数据框。每个数据框都以提供数据的公司命名。我需要一个反复重复公司名称的专栏(当它们全部合并时会有所帮助),但有些公司已经提供了名称,而其他公司则没有。

我创建了一个函数来检查列是否存在,如果不存在则添加它。我在函数中使用substitute()来获取数据框的名称,因为在某些情况下,这是了解名称的唯一方法。但是,我想在lapply()中使用此功能,因为我使用list.files()lapply()将所有文件作为命名列表读入。当您通过lapply()运行我的新函数时,它实际上提供了类似于列表中数据框的索引名称的内容。这是我的代码:

none <- Negate(any) 

compName <- function(df){

 if(none(names(df) == "Company")){
   colEnd <- length(df) + 1
   name <- as.character(substitute(df))
   df[, colEnd] <- name
   colnames(df)[colEnd] <- "Company"

   return(df) 
  } 
}

因此,例如,如果您使用此函数的iris数据框,您将获得一个名为Company的列,其中“iris”一遍又一遍地重复。但是,如果您将虹膜变为命名列表,则会返回"[[" "X" "i"

iris_list <- list(iris, iris)
names(iris_list)[1] <- "iris"
names(iris_list)[2] <- "iris2"

iris_list2 <- lapply(iris_list, compName)
iris_list2[[1]][, 6] #To demonstrate the result

此时我可能只是在导入到R之前手动将公司名称添加到Excel中的每个文件中,但是我已经尝试以编程方式进行此操作。我想我遗漏了一些有关数据框名称基本特征的信息,无论是在列表内部还是外部。

1 个答案:

答案 0 :(得分:2)

也许你可以建立起来:

(res <- lapply(seq(iris_list), function(x) 
                                 transform(iris_list[[x]], Company=names(iris_list)[x])))

# [[1]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species Company
# 1          5.1         3.5          1.4         0.2  setosa    iris
# 2          4.9         3.0          1.4         0.2  setosa    iris
# ...
# 
# [[2]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species Company
# 1          5.1         3.5          1.4         0.2  setosa   iris2
# 2          4.9         3.0          1.4         0.2  setosa   iris2
# ...

此处,lapply直接遍历索引1:length(iris_list)而不是列表元素。 这样,您可以更轻松地访问列表元素的名称:names(iris_list)[x]。 我使用transform作为{ df <- iris_list[[x]]; df$Company=names(iris_list)[x]; return(df) }的快捷方式。 setNamesnames(res) <- names(iris_list)的快捷方式 - 正如您所看到的,res列表丢失了原始名称...