【发布时间】:2023-04-05 19:29:01
【问题描述】:
我有一个非常稀疏的数据集 - 下面是格式的示例。我想根据下面解释的逻辑对特定列进行更改
# 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) 并应用相同的逻辑?
【问题讨论】:
标签: r if-statement dplyr