我在这里做错了什么我试图使用数据帧名称向量将以下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)。
不必是快速解决方案,因为这是一个小数据集
这是一种生成包含统一随机数的数据帧列表的方法,并使用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
>