我有几个数据框,其中一些列共享相同的名称。我试图找到一种方法来系统地从不同的数据框中更改具有相同名称的列的格式。以下是我的想法:
data1=data.frame(a=seq(1:10),b=c("a","b"))
data2=data.frame(a=seq(11:20),b=c("c","d"))
temp = c("data1$a","data2$a")
for (i in 1:length(temp)) {
eval(parse(text=(temp)[i])) = as.character(eval(parse(text=(temp)[i])))
}
运行代码后,我收到以下消息:
Error in file(filename, "r") : cannot open the connection
In addition: Warning message:
In file(filename, "r") :
cannot open file 'data1$a': No such file or directory
但是,如果我运行以下代码,它可以工作:
as.character(eval(parse(text=(temp)[1])))
有人可以帮助纠正我的代码并解释为什么它不起作用吗?
答案 0 :(得分:3)
在我看来,你正在混合数据处理的“分离性”和“系统性”。换句话说,您试图在全局环境中单独存储多个数据对象,但也尝试系统地使用它们。我认为这是一个错误。您应该选择一种数据处理方法,并坚持下去。
1:分离
这个很容易。只需单独存储data.frames(这正是您正在做的),并单独修改它们:
data1 <- data.frame(a=seq(1:10),b=c('a','b'));
data2 <- data.frame(a=seq(11:20),b=c('c','d'));
data1$a <- as.character(data1$a);
data2$a <- as.character(data2$a);
2:系统性
这个要求从一开始就将数据存储在列表中。这可能会略微增加某些代码的详细程度,因为您必须取消引用列表才能访问单个data.frames,但它有助于您正在寻找的系统数据处理,这可以消除大量重复代码:
data <- list(
data.frame(a=seq(1:10),b=c('a','b')),
data.frame(a=seq(11:20),b=c('c','d'))
);
for (i in seq_along(data)) data[[i]]$a <- as.character(data[[i]]$a);
正如您所看到的,这些方法中的每一种都减少了使用凌乱的解析/评估解决方案的需要。通常不需要那种动态代码生成,解析和评估。
答案 1 :(得分:2)
我们可以将数据集置于list
(mget(ls(patterns = "data\\d+"))
)循环list
上,并将感兴趣的列(“col_of_interest”)转换为character
类。为了反映原始对象的更改,我们使用list2env
(但我建议使用list
而不是单个对象。)
col_of_interest <- "a"
list2env(lapply(mget(ls(pattern = "data\\d+")),
function(x) {x[[col_of_interest]] <- as.character(x[[col_of_interest]])
x}), envir = .GlobalEnv)
str(data1)
#'data.frame': 10 obs. of 2 variables:
#$ a: chr "1" "2" "3" "4" ...
#$ b: Factor w/ 2 levels "a","b": 1 2 1 2 1 2 1 2 1 2
注意:本文已经介绍了将数据集放在list
并转换为character
所选列的想法。