试图循环数据帧的向量

问题描述 投票:-1回答:1

我在这里做错了什么我试图使用数据帧名称向量将以下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)。

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

r loops
1个回答
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
> 
© www.soinside.com 2019 - 2024. All rights reserved.