使用colSds时出错;跨列表循环时出错

时间:2017-03-14 20:22:39

标签: r loops

我有以下列表:

Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> a = numpy.array([[1,  1,  2,  3,  4, 5, 6],
...                  [1,  11, 12, 13, 14, 15, 16],
...                  [3,  22, 23, 24, 25, 26, 27]])
>>> stride = 2
>>> numpy.array(map(lambda row: row[row[0]:row[0] + stride + 1], a))
array([[ 1,  2,  3],
       [11, 12, 13],
       [24, 25, 26]])

我的目的是获取不同的数据框,其中包含列表中每个元素的某些列的均值和sd。尝试使用colSds获取sd时出现了第一个问题。

d1<-data.frame(y1=c(34,56,89,45),y2=c(42,54,68,25),y3=c(253,547,586,258),y4=c(233,537,554,258))
d2<-data.frame(y1=c(37,26,14,67),y2=c(65,54,43,23),y3=c(243,577,516,125),y4=c(267,527,567,368))
d3<-data.frame(y1=c(35,24,14,58),y2=c(65,51,43,21),y3=c(267,527,567,368),y4=c(243,577,516,125))
d4<-data.frame(y1=c(34,23,13,36),y2=c(65,55,44,24),y3=c(233,537,554,258),y4=c(253,547,586,258))
lst <- list(d1,d2,d3,d4)

一旦我运行此脚本,我就会收到以下错误:

colVars中的错误(x,rows = rows,cols = cols,...):   参数'x'必须是矩阵或向量。

平均功能仍然有效,所以我有一个包含所有方法的新列表(W.mean)

现在我想用手段创建separete data.frame(还包括de sd,但我需要让它工作)

W.mean<-list()
W.sd<-list()
for (i in ids){
  W.mean<-lapply(lst, function(i) colMeans(i[,c(1,2,4)],na.rm=TRUE))
  W.sd<-lapply(lst, function(i) colSds(i[,c(1,2,4)],na.rm = TRUE))
} 

但是我收到一个新错误:t.default中的错误(W.mean [[i]]):参数不是矩阵

有人可以帮我修复错误吗? TAHNKS

1 个答案:

答案 0 :(得分:0)

原因是因为colSds适用于matrix而不是data.frame。根据{{​​1}}

中的Description
  

描述 - a中每行(列)的标准差估计值   基质

?colSds
  

colVars中的错误(x,rows = rows,cols = cols,...):参数'x'   必须是矩阵或向量。

因此,将'data.frame'转换为'matrix',它应该可以正常工作

lapply(lst, function(i) colSds(i[, c(1,2, 4)], na.rm = TRUE))

此外,

中的lapply(lst, function(i) colSds(as.matrix(i[, c(1,2, 4)]), na.rm = TRUE)) #[[1]] #[1] 23.76272 18.24600 173.64427 #[[2]] #[1] 22.70095 17.91415 139.72682 #[[3]] #[1] 18.89224 18.40290 216.20110 #[[4]] #[1] 10.66146 17.56891 180.27202 循环
for
如果意图只是循环for(i in ids) { } list并获得data.framecolMeans,那么

似乎是不必要的。另外,我们可以在一次colSds调用中执行此操作,而不是多个lapply

lapply

可以通过res1 <- lapply(lst, function(i) t(cbind(Mean = colMeans(i[, c(1,2, 4)], na.rm = TRUE), Sds = colSds(as.matrix(i[, c(1,2, 4)]), na.rm = TRUE)))) 内容

将其转换为单个数据集
rbind