列表中数据框的计算
Calculations on data frames in a list
我有一个数据框列表:
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
的新手,所以请多关照 ;-)
编辑:下面发布的两种解决方案都有效!感谢您的帮助:-)
这里是我在评论中提出的建议的完整实现。
首先我们模拟一些数据:
listOfDataframes<- list(
df1 = data.frame(X = runif(100), Y = runif(100), Z = runif(100)),
df2 = data.frame(X = runif(100), Y = runif(100), Z = runif(100)),
df3 = data.frame(X = runif(100), Y = runif(100), Z = runif(100))
)
然后我们写一个函数来执行想要的操作。请注意,使用 return
是不必要的,只是为了清楚起见。
yourFun <- function(df) {
df$new_x <- sqrt(2/(1-df$Z)) * df$X
df$new_y <- sqrt(2/(1-df$Z)) * df$Y
return(df) # just "df" would produce the same result
}
然后我们将函数应用于您的 data.frames 列表并将结果分配给新列表:
newList <- lapply(listOfDataframes, yourFun)
最后,我们显示每个数据帧的前几个条目来验证我们的结果。
lapply(newList, head)
$df1
X Y Z new_x new_y
1 0.7122989 0.85574735 0.26176397 1.1724104 1.4085198
2 0.8373206 0.18083472 0.19733040 1.3217167 0.2854489
3 0.6780758 0.76722834 0.48987088 1.3426203 1.5191462
4 0.3694669 0.42579811 0.10287797 0.5516515 0.6357597
5 0.1466816 0.69924651 0.08006688 0.2162781 1.0310202
6 0.3280546 0.06574292 0.22372561 0.5265669 0.1055252
$df2
X Y Z new_x new_y
1 0.9385518 0.50570095 0.3062779 1.593604 0.85864969
2 0.6672409 0.66002494 0.3721208 1.190857 1.17797831
3 0.7559528 0.73025591 0.4063969 1.387591 1.34042338
4 0.1960170 0.01639017 0.9700715 1.602382 0.13398487
5 0.9336734 0.76437690 0.3301318 1.613301 1.32077206
6 0.7320958 0.03640788 0.1761000 1.140632 0.05672482
$df3
X Y Z new_x new_y
1 0.45050818 0.9843507 0.8956288 1.9720924 4.3089794
2 0.32775145 0.1385610 0.9713440 2.7381165 1.1575725
3 0.07208382 0.8635344 0.5244027 0.1478200 1.7708221
4 0.50439997 0.1328935 0.5827728 1.1043424 0.2909594
5 0.46265459 0.3394566 0.4912585 0.9173252 0.6730551
6 0.15894944 0.4517309 0.3610197 0.2812097 0.7991919
我有一个数据框列表:
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
的新手,所以请多关照 ;-)
编辑:下面发布的两种解决方案都有效!感谢您的帮助:-)
这里是我在评论中提出的建议的完整实现。
首先我们模拟一些数据:
listOfDataframes<- list(
df1 = data.frame(X = runif(100), Y = runif(100), Z = runif(100)),
df2 = data.frame(X = runif(100), Y = runif(100), Z = runif(100)),
df3 = data.frame(X = runif(100), Y = runif(100), Z = runif(100))
)
然后我们写一个函数来执行想要的操作。请注意,使用 return
是不必要的,只是为了清楚起见。
yourFun <- function(df) {
df$new_x <- sqrt(2/(1-df$Z)) * df$X
df$new_y <- sqrt(2/(1-df$Z)) * df$Y
return(df) # just "df" would produce the same result
}
然后我们将函数应用于您的 data.frames 列表并将结果分配给新列表:
newList <- lapply(listOfDataframes, yourFun)
最后,我们显示每个数据帧的前几个条目来验证我们的结果。
lapply(newList, head)
$df1
X Y Z new_x new_y
1 0.7122989 0.85574735 0.26176397 1.1724104 1.4085198
2 0.8373206 0.18083472 0.19733040 1.3217167 0.2854489
3 0.6780758 0.76722834 0.48987088 1.3426203 1.5191462
4 0.3694669 0.42579811 0.10287797 0.5516515 0.6357597
5 0.1466816 0.69924651 0.08006688 0.2162781 1.0310202
6 0.3280546 0.06574292 0.22372561 0.5265669 0.1055252
$df2
X Y Z new_x new_y
1 0.9385518 0.50570095 0.3062779 1.593604 0.85864969
2 0.6672409 0.66002494 0.3721208 1.190857 1.17797831
3 0.7559528 0.73025591 0.4063969 1.387591 1.34042338
4 0.1960170 0.01639017 0.9700715 1.602382 0.13398487
5 0.9336734 0.76437690 0.3301318 1.613301 1.32077206
6 0.7320958 0.03640788 0.1761000 1.140632 0.05672482
$df3
X Y Z new_x new_y
1 0.45050818 0.9843507 0.8956288 1.9720924 4.3089794
2 0.32775145 0.1385610 0.9713440 2.7381165 1.1575725
3 0.07208382 0.8635344 0.5244027 0.1478200 1.7708221
4 0.50439997 0.1328935 0.5827728 1.1043424 0.2909594
5 0.46265459 0.3394566 0.4912585 0.9173252 0.6730551
6 0.15894944 0.4517309 0.3610197 0.2812097 0.7991919