【发布时间】:2015-03-12 15:59:40
【问题描述】:
我有一个数据框列表:
str(Test)
List of 3
$ A:'data.frame': 32400 obs. of 4 variables:
..$ X : num [1:32400] -0.0152 -0.0302 -0.0453 -0.0604 -0.0755 ...
..$ Y : num [1:32400] 0.00875 0.01745 0.02615 0.0349 0.0436 ...
..$ Z : num [1:32400] -1 -0.999 -0.999 -0.998 -0.996 ...
..$ Ts: num [1:32400] 0.000427 0.001696 0.003805 0.006765 0.010537 ...
$ B:'data.frame': 32400 obs. of 4 variables:
..$ X : num [1:32400] -0.0153 -0.0305 -0.0457 -0.061 -0.0763 ...
..$ Y : num [1:32400] 0.00848 0.01692 0.02536 0.03384 0.04228 ...
..$ Z : num [1:32400] -1 -0.999 -0.999 -0.998 -0.996 ...
..$ Ts: num [1:32400] 0.000427 0.001696 0.003805 0.006765 0.010537 ...
$ C:'data.frame': 32400 obs. of 4 variables:
..$ X : num [1:32400] -0.0155 -0.0308 -0.0462 -0.0616 -0.077 ...
..$ Y : num [1:32400] 0.00822 0.01638 0.02455 0.03277 0.04094 ...
..$ Z : num [1:32400] -1 -0.999 -0.999 -0.998 -0.996 ...
..$ Ts: num [1:32400] 0.000427 0.001696 0.003805 0.006765 0.010537 ...
我想在每个数据框中创建两个新列。新值基于每个数据帧的X、Y、Z:
new_x = sqrt(2/(1-Z)) * X
new_y = sqrt(2/(1-Z)) * Y
我已经尝试了一些东西(并且阅读了很多),这是我认为应该起作用的:
t=function(x){
new_x = sqrt(2/(1-x[,3])) * x[,1]
new_y = sqrt(2/(1-x[,3])) * x[,2] }
New_Test=lapply(Test, within, t)
但是,这只会创建一个新的list,它与旧的list 完全相同。
我尝试使用mapply 并查看了plyr 包但找不到解决方案。我对R 还很陌生,所以请善待;-)
编辑:下面发布的两种解决方案都有效!感谢您的帮助:-)
【问题讨论】:
-
不完全相关,但我建议不要将变量命名为“list”,因为 list 是一个基本的 r 函数。
-
在您的函数
t中尝试x$new_x = ...。目前,据我所知,您没有分配任何东西。 -
你能把
dput(Test)的结果贴出来吗? -
Test2 <- lapply(Test, function(df) {df$new_x <- sqrt(2/(1-df$Z)) * df$X; df$new_y <- sqrt(2/(1-df$Z)) * df$Y; return(df)})之类的东西可能会起作用。 -
@Buckminster 的代码为我提供了新的列(称为 new_x 和 new_y,但值与 X 和 Y 中的值完全相同。这很奇怪......