我们假设数据框包含四列
set.seed(123)
x1 <- runif(10,0,1)
x2 <- runif(10,0,1)
x3 <- runif(10,0,1)
x4 <- runif(10,0,1)
DF <- data.frame(x1,x2,x3,x4)
对于每列,我想计算小于或等于0.5的观测数。这是我的代码,但它似乎没有起作用:
a <- vector()
pvect1 <- vector()
for (j in 1:ncol(DF))
{
for (i in 1:nrow(DF))
{
if (DF[i,j] <= 0.5)
a[i]=1
else
a[i]=0
pvect1[j] <- cumsum(a[i])
}
}
最后,我想创建一个包含两列(C1和C2)的新数据帧(让它称之为DF2),其中C1是DF中的列名(x1,x2,x3和x4),和C2是DF中每列的小于或等于0.5的观测数。
答案 0 :(得分:2)
我们可以在逻辑colSums
上matrix
查找每列中的TRUE元素数
v1 <- colSums(DF <= 0.5)
创建data.frame
,
DF2 <- data.frame(C1 = names(v1), C2 = v1, stringsAsFactors=FALSE)
如果我们真的需要使用for
循环
a <- vector() #it is better to pre-allocate the size
pvect1 <- vector() #same comment as above
for (j in 1:ncol(DF)) {
for (i in 1:nrow(DF)) {
if (DF[i,j] <= 0.5) {
a[i]=1
} else {
a[i]=0
}
}
pvect1[j] <- sum(a)
}
使用矢量化解决方案进行检查
identical(as.vector(v1), pvect1)
#[1] TRUE