试图循环数据帧的向量

时间:2017-12-26 21:45:34

标签: r loops

我在这里做错了什么。我试图使用数据帧名称向量将以下2行应用于循环

df[5:length(df)][!is.na(df[5:length(df)])] <- 1
df[5:length(df)][is.na(df[5:length(df)])] <- 0

namelist是12个df名称

的向量
for(i in namelist){
 i[5:length(i)][!is.na(i[5:length(i)])] <- 1
 i[5:length(i)][is.na(i[5:length(i)])] <- 0
  }

要保留所有数据帧中的变量1:4,但我想将其余数据作为二进制(na = 0,否则为1),但每个数据帧的大小可以变化(obs和vars)。

不一定是快速解决方案,因为这是一个小数据集

1 个答案:

答案 0 :(得分:0)

这是一种生成包含统一随机数的数据帧列表的方法,并按照OP注释中的建议用lapply()处理它。我们使用is.na()来创建结果数据帧,而不是使用> 0.5设置TRUE与FALSE,因为作为runif()值矩阵创建的数据帧不会有缺失值。

请注意,is.na()可用于将整个输出数据帧设置为TRUE或FALSE值。 !is.na()不需要第二次传递数据。

另请注意,解决方案会随机分配数据框中的列数,因此可以看到解决方案不需要了解每个数据框中的列数。

最后,为了说明如何处理列的子集而不是整个输入数据帧,我们包括将原始数据的前4列与逻辑列绑定的逻辑。

set.seed(95014123)
dataList <- lapply(1:5,function(x) {
     columnCount <- sample(6:10,1)
     data.frame(matrix(runif(10*columnCount),nrow=10,ncol=columnCount))
})

# recode to binary based on whether values are > 0.5
resultList <- lapply(dataList,function(x) {
     recodedCols <- as.data.frame(x[,5:ncol(x)] > .5)
     colNames <- names(x[,5:ncol(x)])
     names(recodedCols) <- colNames
     cbind(x[,1:4],recodedCols)
 })

 # count sum of TRUEs across data tables
 unlist(lapply(resultList,function(x){
     sum(colSums(x[,5:ncol(x)]))
 }))

...和输出:

> unlist(lapply(resultList,function(x){
+      sum(colSums(x[,5:ncol(x)]))
+ }))
[1] 27 20 22 27 17
>

更新:此解决方案可生成NA值的随机百分比,并使用is.na()创建结果数据框。

set.seed(95014123)
dataList <- lapply(1:5,function(x) {
     columnCount <- sample(6:10,1)
     pctMissing <- sample(c(0.1,0.2,0.3,0.4,0.5),1)
     dataValues <- runif(10*columnCount)
     missingIds <- sample(1:(10*columnCount),
                          size=(pctMissing*10*columnCount)) 
     dataValues[missingIds] <- NA
     data.frame(matrix(dataValues,nrow=10,ncol=columnCount))
})

resultList <- lapply(dataList,function(x) {
     recodedCols <- as.data.frame(is.na(x[,5:ncol(x)])) 
     colNames <- names(x[,5:ncol(x)])
     names(recodedCols) <- colNames
     cbind(x[,1:4],recodedCols)
})

# count sum of TRUEs across data tables
unlist(lapply(resultList,function(x){
     sum(colSums(x[,5:ncol(x)]))
}))

...和输出:

> unlist(lapply(resultList,function(x){
+      sum(colSums(x[,5:ncol(x)]))
+ }))
[1] 23 16  9  1 17
>