2013-02-26 98 views
2

我有一个很大的列表,我想在列表中的每个对象的每一行做rowSumsrowSums列表中的所有对象与R

以下是我有:

> DFTYPE 
[[1]] 
[[1]][[1]] 
    DGDG.36.5 DGDG.36.6 
1 978.4906 3585.613 
1 1280.9531 8740.503 
1 1228.3969 6082.900 
1 5245.2437 18104.022 
1 0.0000 827.650 

[[1]][[2]] 
    DGDG.36.5 DGDG.36.6 
2 0.0000 917.5844 
2 513.5063 976.2344 
2 516.5781 1540.6000 
2 838.5406 3486.5563 
2 1146.8812 3962.2906 
2 0.0000 1050.5281 

[[1]][[3]] 
    DGDG.36.5 DGDG.36.6 
3 1755.0656 10924.975 
3 713.2969 4681.759 
3 946.1094 3319.722 
3 1569.5281 6531.266 
3 1827.9156 10501.375 
3 0.0000 1973.325 


[[2]] 
[[2]][[1]] 
    MGDG.34.4 MGDG.34.5 MGDG.34.6 MGDG.36.4 MGDG.36.5 MGDG.36.6 
1 891.950 1463.695 14266.34  0.000 1368.040 5015.425 
1 2596.695 4228.470 38945.15 1531.350 5617.475 14647.965 
1 1536.595 3273.335 30895.44 1610.060 4415.735 11106.930 
1 4471.495 9894.595 71023.04 4086.105 9536.450 24968.695 

[[2]][[2]] 
    MGDG.34.4 MGDG.34.5 MGDG.34.6 MGDG.36.4 MGDG.36.5 MGDG.36.6 
2   0  0.0 2158.405  0.00 1478.710 2350.265 
2   0  0.0 1409.740  0.00 1776.775 2110.440 
2   0  0.0 1910.240  0.00 1044.570 2410.740 
2   0  913.5 4558.720 1071.78 1499.770 3616.110 
2   0  0.0 7980.890 1993.40 1044.855 8468.875 
2   0  0.0 1593.260 792.46  0.000 1019.770 

[[2]][[3]] 
    MGDG.34.4 MGDG.34.5 MGDG.34.6 MGDG.36.4 MGDG.36.5 MGDG.36.6 
3 1225.095 1994.225 20028.34 1728.695 3503.870 11717.955 
3 948.865 1284.680 9522.01 487.985 1702.520 4291.785 
3  0.000 1396.415 10216.45 1062.240 1438.825 5163.490 
3 1077.845 2422.845 20380.78 2904.935 3147.180 8760.835 
3 1135.710 3821.430 29022.75 1555.960 3652.580 12318.555 
3  0.000 870.055 12322.73  0.000 1652.525 5136.380 

我然后创建一个新的列表,以获得和的结果:

> DFttt<-list() 
> DFttt<-rowSums(DFTYPE) 
Error in rowSums(DFTYPE) : 
    'x' must be an array of at least two dimensions 

回答

4

考虑如下一个名为List列表:

set.seed(1)  
List <- list(list(matrix(rnorm(10), ncol=2), matrix(rnorm(10), ncol=2)), 
       list(matrix(rnorm(10), ncol=2), matrix(rnorm(10), ncol=2))) 
lapply(List, function(x) lapply(x, rowSums)) 

[[1]] 
[[1]][[1]] 
[1] -1.44692219 0.67107238 -0.09730391 2.17106215 0.02411938 

[[1]][[2]] 
[1] 1.4668476 0.3736530 0.3225956 -1.3934787 1.7188322 


[[2]] 
[[2]][[1]] 
[1] 0.8628486 0.6263408 -1.3961874 -2.4675018 1.0377673 

[[2]][[2]] 
[1] 0.9436850 -0.4970777 0.3283582 1.0462203 -0.6138838 
+0

+1的速度! – juba 2013-02-26 10:40:22

+0

也感谢吉尔伯,同样的答案,相同的时间(7秒):) – Gui 2013-02-26 11:23:56

0

你举的例子是不可复制的,但这样的:

DFttt = lapply(DFTYPE, rowSums) 

应该去诀窍。

+1

它的目录列表。我不认为这会工作,除非你做'unlist(DFTYPE,递归= F)'。它仍然会给你一个列表作为输出,而不是列表的列表。 – Arun 2013-02-26 10:52:33

+0

但一般的工作流程应该是这样的。 – 2013-02-26 11:07:53

+1

我明白这一点。我指出的唯一原因是因为你的代码在运行'rowSums(DFttt)'的时候会给出OP准确**错误。 ''x'必须是至少有两个维度的数组'。 – Arun 2013-02-26 11:11:33

4

我想你会需要一个双lapply

数据如下:

df <- data.frame(x=1:5,y=2:6) 
df2 <- data.frame(u=3:7,v=4:8) 
mylist <- list(list(df, df2),list(df,df2)) 
mylist 

[[1]] 
[[1]][[1]] 
    x y 
1 1 2 
2 2 3 
3 3 4 
4 4 5 
5 5 6 

[[1]][[2]] 
    u v 
1 3 4 
2 4 5 
3 5 6 
4 6 7 
5 7 8 


[[2]] 
[[2]][[1]] 
    x y 
1 1 2 
2 2 3 
3 3 4 
4 4 5 
5 5 6 

[[2]][[2]] 
    u v 
1 3 4 
2 4 5 
3 5 6 
4 6 7 
5 7 8 

您可以使用:

lapply(mylist, function(l) lapply(l, rowSums)) 

其中给出:

[[1]] 
[[1]][[1]] 
[1] 3 5 7 9 11 

[[1]][[2]] 
[1] 7 9 11 13 15 


[[2]] 
[[2]][[1]] 
[1] 3 5 7 9 11 

[[2]][[2]] 
[1] 7 9 11 13 15 
+1

我击败了你7秒;)+1为你:D – 2013-02-26 10:38:32

+1

@Jberber Grrr ...与完全相同的答案:) – juba 2013-02-26 10:39:27

+0

+1,尽管我讨厌双乐队循环......就像双循环一样。 – 2013-02-26 11:08:49