计算列表中的数据帧

时间:2015-03-12 15:59:41

标签: r list dataframe lapply

我有一个数据框列表:

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 ...

我想在每个数据框中创建两个新列。新值基于每个数据框的XYZ

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相当新,所以要善良; - )

编辑:下面发布的两个解决方案都有效!谢谢你的帮助: - )

1 个答案:

答案 0 :(得分:0)

以下是我在评论中提出的建议的全面实施。

首先我们模拟一些数据:

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