R使用条件添加到循环中的列表中

R使用条件添加到循环中的列表中,r,R,我有一个data.frame dim=(200500) 我想对数据帧的每一列执行shaprio.test,并附加到列表中。这就是我正在尝试的: colstoremove <- list(); for (i in range(dim(I.df.nocov)[2])) { x <- shapiro.test(I.df.nocov[1:200,i]) colstoremove[[i]] <- x[2] } colstoremove考虑lappy(),

我有一个data.frame dim=(200500)

我想对数据帧的每一列执行
shaprio.test
,并附加到列表中。这就是我正在尝试的:

 colstoremove <- list();
 for (i in range(dim(I.df.nocov)[2])) {
     x <- shapiro.test(I.df.nocov[1:200,i])
     colstoremove[[i]] <- x[2]
    }
colstoremove考虑
lappy()
,因为传入的任何数据帧都会对列运行操作,返回的列表将等于列数:

colstoremove <- lapply(I.df.noconv, function(col) shapiro.test(col)[2])
colstoremove考虑
lappy()
,因为传入的任何数据帧都会对列运行操作,返回的列表将等于列数:

colstoremove <- lapply(I.df.noconv, function(col) shapiro.test(col)[2])

colstoremove以下是在

for (i in range(dim(I.df.nocov)[2]))
为了举例,我假设
I.df.nocov
包含100行和5列

dim(I.df.nocov)
I.df.nocov
维度的向量,即c(100,5)

dim(I.df.nocov)[2]
I.df.nocov
的第二维度,即5

范围(x)
是一个2元素向量,包含x的最小值和最大值。例如,范围(c(4,10,1))是c(1,10)。所以
范围(dim(I.df.nocov)[2])
是c(5,5)

因此,循环迭代两次:第一次使用i=5,第二次也使用i=5。它失败了也就不足为奇了

问题是R的函数
range
和Python的同名函数做完全不同的事情。Python的
范围的等价物称为
seq
。例如,
seq(5)=c(1,2,3,4,5)
,而
seq(3,5)=c(3,4,5)
,以及
seq(1,10,2)=c(1,3,5,7,9)
。您也可以编写
1:n
,它与
seq(n)
相同,
m:n
seq(m,n)
相同(但是“:”的优先级非常高,因此
1:2*x
被解释为
(1:2)*x

一般来说,如果某些函数在R中不起作用,您应该从内部到外部打印子表达式。如果某些子表达式太大而无法打印,请使用str(x)(str表示“结构”)。并且永远不要假设Python和R中的函数是相同的!如果有同名函数,它通常会执行不同的操作


另一方面,您可以编写
ncol(I.df.nocov)
(还有一个函数
nrow
),而不是
dim(I.df.nocov)[2]

for (i in range(dim(I.df.nocov)[2]))
为了举例,我假设
I.df.nocov
包含100行和5列

dim(I.df.nocov)
I.df.nocov
维度的向量,即c(100,5)

dim(I.df.nocov)[2]
I.df.nocov
的第二维度,即5

range(x)
是一个包含x的最小值和最大值的2元素向量。例如,range(c(4,10,1))是c(1,10)。因此
range(dim(I.df.nocov)[2])
是c(5,5)

因此,循环迭代两次:第一次使用i=5,第二次也使用i=5。失败并不奇怪

问题是R的函数
range
和同名Python函数做的事情完全不同。Python的
range
的等价物被称为
seq
。例如,
seq(5)=c(1,2,3,4,5)
,而
seq(3,5)=c(3,4,5)
,以及
seq(1,10,2)=c(1,3,5,7,9)
。您也可以编写
1:n
,它与
seq(n)
相同,
m:n
seq(m,n)
(但是“:”的优先级非常高,因此
1:2*x
被解释为
(1:2)*x

一般来说,如果某些函数在R中不起作用,您应该从内部到外部打印子表达式。如果某些子表达式太大而无法打印,请使用str(x)(str表示“结构”)。并且永远不要假设Python和R中的函数是相同的!如果有同名函数,它通常会执行不同的操作


另一方面,您可以编写
ncol(I.df.nocov)
(还有一个函数
nrow
),而不是
dim(I.df.nocov)[2]

为什么要使用range来生成循环索引?在seq\u-along(I.df.nocov)中使用
I
代替。为什么要使用range来生成循环索引?在seq\u-along中使用
I(I.df.nocov)
相反。在这种情况下,我喜欢使用
函数(col)shapiro.test(col)[2]
来强调
lappy
作用于数据帧的列。在这种情况下,我喜欢使用
函数(col)shapiro.test(col)[2]
强调
lappy
作用于数据框的列。