同时向多个数据框添加新列

时间:2016-08-03 10:56:18

标签: r function

我有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)是我在新列中看到的结果。

有人可以提出改进吗?在此先感谢!!

3 个答案:

答案 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)分配给字符向量,在这种情况下,该字符向量是当时的每个数据帧。

希望这会有所帮助。