r - 根据条件和列名字符串更改多个列
问题描述
我有一个非常稀疏的数据集 - 下面是格式的一个例子。我想根据下面解释的逻辑对特定列进行更改
# 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 )并应用相同的逻辑?
解决方案
你可以做
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
推荐阅读
- java - Java 更改单元格内容而不是创建新单元格
- javascript - 在 react 16.7 中启用 css 模块
- c# - 找不到部分文件路径
- sql - LIMIT 的有效替代方案是什么?
- reactjs - 更改图像 OnMouseOver 一个 div React
- asp.net-core - 当他从另一台计算机登录时,从其他计算机(他之前登录的)注销用户
- javascript - 显示从 JSON 到 HTML 表的数据
- asp.net-mvc - 'IHtmlHelper
' 不包含 nopcommerce 4.0 中 'Widget' 的定义 - php - 如何获得事件的创建者?
- c++ - QTableview如何保存复选框值c ++