设置:我读过一堆数据框。每个数据框都以提供数据的公司命名。我需要一个反复重复公司名称的专栏(当它们全部合并时会有所帮助),但有些公司已经提供了名称,而其他公司则没有。
我创建了一个函数来检查列是否存在,如果不存在则添加它。我在函数中使用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中的每个文件中,但是我已经尝试以编程方式进行此操作。我想我遗漏了一些有关数据框名称基本特征的信息,无论是在列表内部还是外部。
答案 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) }
的快捷方式。
setNames
是names(res) <- names(iris_list)
的快捷方式 - 正如您所看到的,res
列表丢失了原始名称...