首页 > 解决方案 > 根据条件和列名字符串更改多个列

问题描述

我有一个非常稀疏的数据集 - 下面是格式的一个例子。我想根据下面解释的逻辑对特定列进行更改

# create dummy data set
pb=c('1','0','0','0','0','1','Not_ans','1','0','Not_ans')
qa=c('1','1','0','0','1','0','Not_ans','1','Not_ans','Not_ans')
#zy=c('1','Not_ans','0','1','Not_ans','0','1','1','1','Not_ans')

#sub questions for pb
pb.abr=c('1','0','0','0','0','1','0','1','0','0')
pb.ras=c('0','0','0','0','1','0','0','1','0','0')
pb.sfg=c('1','0','0','0','0','0','0','1','0','0')

#sub questions for qa
qa.fgs=c('1','0','0','0','0','0','0','1','0','0')
qa.sdf=c('0','1','0','0','0','0','0','0','0','0')
qa.tyu=c('0','0','0','0','1','0','0','1','0','0')

df=data.frame(pb,qa,pb.abr,pb.ras,pb.sfg,qa.fgs,qa.sdf,qa.tyu)
df

        pb      qa pb.abr pb.ras pb.sfg qa.fgs qa.sdf qa.tyu
1        1       1      1      0      1      1      0      0
2        0       1      0      0      0      0      1      0
3        0       0      0      0      0      0      0      0
4        0       0      0      0      0      0      0      0
5        0       1      0      1      0      0      0      1
6        1       0      1      0      0      0      0      0
7  Not_ans Not_ans      0      0      0      0      0      0
8        1       1      1      1      1      1      0      1
9        0 Not_ans      0      0      0      0      0      0
10 Not_ans Not_ans      0      0      0      0      0      0

两列 pb 和 qa 称为基列,它们还有其他子列,命名约定为 pb。和质量保证。- 所以我们看到 pa 有 3 个子列, qa 有 3 个子列。我想根据基列(pa 或 qa)的条件对这些子列进行更改。

条件是如果列pb =='Not_ans'然后使所有子列(pb.abr、pb.ras 和 pb.sfg)='Not_applicable'

我如何编写一个实现这一目标的函数?我在其中指定基列名称,即下面pb的子列示例的命名'pb.'- 会不会像下面这样,但它不会给出结果

data.frame(ifelse(df['base_q']=='Not_ans',
df[ , grepl( paste('base_q','.') , names(df) )]=='Not_applicable',df[,grepl( 
paste('base_q','.') , names(df)) ])

我如何编写一个将基列号作为输入的通用函数,例如 1,2 这里 - 应用该函数,即无论 pb 是 Not_ans 哪里,它都会将 sub_columns (pb.abr,pb.ras,pb.sfg) 更改为不适用和然后移动到第 2 列( qa )并应用相同的逻辑?

标签: rif-statementdplyr

解决方案


你可以做

yf=function(df,v){
   df[df[v]=='Not_ans',][,names(df)[substr(names(df),1,nchar(v)+1)==paste0(v,'.')]]='Not_applicable'
   return(df)
 }
yf(df,'pb')
        pb      qa         pb.abr         pb.ras         pb.sfg qa.fgs qa.sdf qa.tyu
1        1       1              1              0              1      1      0      0
2        0       1              0              0              0      0      1      0
3        0       0              0              0              0      0      0      0
4        0       0              0              0              0      0      0      0
5        0       1              0              1              0      0      0      1
6        1       0              1              0              0      0      0      0
7  Not_ans Not_ans Not_applicable Not_applicable Not_applicable      0      0      0
8        1       1              1              1              1      1      0      1
9        0 Not_ans              0              0              0      0      0      0
10 Not_ans Not_ans Not_applicable Not_applicable Not_applicable      0      0      0

数据输入

df=data.frame(pb,qa,pb.abr,pb.ras,pb.sfg,qa.fgs,qa.sdf,qa.tyu,stringsAsFactors = F) 
# notice stringsAsFactors 

推荐阅读