首页 > 解决方案 > R:创建不同数量的赋值语句的最佳方法

问题描述

我有一个必须定期运行的脚本,我在 R 中使用不同数量的赋值语句,如下所示:

r5$NWord_1<-ifelse(r5$Match==1,NA,r5$NWord_1)
r5$NWord_2<-ifelse(r5$Match==2,NA,r5$NWord_2)
r5$NWord_3<-ifelse(r5$Match==3,NA,r5$NWord_3)
r5$NWord_4<-ifelse(r5$Match==4,NA,r5$NWord_4)
r5$NWord_5<-ifelse(r5$Match==5,NA,r5$NWord_5)
r5$NWord_6<-ifelse(r5$Match==6,NA,r5$NWord_6)

r5$NWord_7<-ifelse(r5$Match==7,NA,r5$NWord_7)

问题是“NWord”变量的数量从运行到运行通常在 5 到 7 之间变化)。我将“NWord”变量的数量单独存储为大小。

Size<-5

我尝试了以下方法,但 get() 仅适用于对象,而不适用于数据框列。

for(i in 1:Size){
    get(paste("r5$NWord_",i,sep=""))<-ifelse(r5$Match==i,NA,get(paste("r5$NWord_",i,sep="")))
}

我很好奇:自动化这个过程的最佳方法是什么,所以我不必每次都手动运行这些语句的子集?

标签: rloops

解决方案


对于那些感兴趣的人:1)导入数据是宽格式的(这是系统允许我下载的)。2) 导出数据必须是宽格式才能上传到系统。由于这些只是数据集中大约 200 个变量中的一小部分,因此在 Wide 和 long 之间来回切换,然后 long 回到 Wide (可能多次)似乎很麻烦并且容易出错。因此,我想出了这个:

idx1<-which(colnames(r5)=="NWord_1")
idx2<-which(colnames(r5)==paste("NWord_",Size,sep=""))
for(i in idx1:idx2){
    r5[,i]<-ifelse(r5$Match==1,NA,r5[,i])
}

似乎工作得很好,但是,我不确定这是最有效的编码方式。


推荐阅读