我有7个数据集DF1..DF7&其中一些数据的格式如下:
Lowerbound Upperbound
738.5349709 2418.259919
734.5215381 2160.478003
1826.381884 2753.12212
452.3846655 3013.798816
542.6524558 863.0564862
399.4240401 2862.168099
我想计算2列和2之间的差异。同时为所有数据集添加第3列&称之为“间隔”。我使用了以下代码:
filenames <- names(which(sapply(.GlobalEnv, is.data.frame)))
for(i in seq_along(filenames)) {
x <- get(filenames[i])
for(j in 1:length(x))
{
x$Interval[[j]] <- ((x$upper_bound[[j]] -x$lower_bound[[j]])/x$actual[[j]])/2
}
assign(filenames[i], x)
}
生成列“interval”但填充的值是错误的:numeric(0)是我在新列中看到的结果。
有人可以提出改进吗?在此先感谢!!
答案 0 :(得分:2)
您的代码方式比它需要的更复杂。你可以简单地在R中减去两个向量:
data$interval = data$Upperbound - data$Lowerbound
或者,使用within
:
data = within(data, interval = Upperbound - Lowerbound)
现在将此应用于您的所有数据框:
filenames = mget(paste0('DF', 1 : 7))
filenames = lapply(filenames, function (data) within(data, interval = Upperbound - Lowerbound))
(请注意,这将创建数据框的 new 列表,而不是修改原始数据框。)
更好的是,将所有数据合并到一个数据框中,并添加一个指定原点的列。
答案 1 :(得分:1)
我们使用list
获取mget
中的所有数据集,使用lapply
循环list
元素,使用{{1创建新列'Interval'通过获取'Upperbound','Lowerbound'和除以'actual'之间的差异(在您的数据中没有看到,但我猜它已经存在)
transform
答案 2 :(得分:0)
我做了不同的事情。也许不是最有效的方法,但这可以让您循环修改数据帧:
1:获取要使用ls(pattern = "YOUR-PETTERN")
修改的数据帧的向量。在这种情况下,假设您没有其他具有模式“ DF”的对象,则您的模式为“ DF”
确保使用ls()仅获得要修改的对象!
然后,这应该是代码。这将修改您的对象
for (i in ls(pattern = "DF")) {
assign(i,transform(get(i),Interval = ((Upperbound - Lowerbound)/actual)/2)
}
assign
只是将您正在做的事情(在这种情况下为transform
)分配给字符向量,在这种情况下,该字符向量是当时的每个数据帧。
希望这会有所帮助。