我在这里做错了什么。我试图使用数据帧名称向量将以下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)。
不一定是快速解决方案,因为这是一个小数据集
答案 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
>