我有以下df
var1 var2 a1 a2
1 a b y z
2 b a z y
3 b b z z
从以下代码
创建help <- data.frame(var1 = c("a", "b", "b"), var2 = c("b", "a", "b"), a1 = c(y, z, z), a2 = c(z, y, z))
我打算创建一个ifelse语句,我能够(1)将所有a1值替换为&#39; bp&#39;当var1等于&#39; a&#39;和(2)将所有a2值替换为&#39; bp&#39;当var2等于&#39; a&#39;。如果var1或var2不是&#39; a&#39;我不想更改值。
ifelse命令不是解决此问题的最佳方法吗?我开始使用help$a1[help$a1 == "a"] <- "bp"
手动完成每个操作,但是,由于我有多个变量和一个大型数据集,因此需要一些时间。任何援助都会很棒。
非常感谢。
答案 0 :(得分:1)
您可以使用标准子集。假设每个问题编辑a1
和a2
属于“字符”类,那么
df
# var1 var2 a1 a2
#1 a b y z
#2 b a z y
#3 b d z z
df[,3:4][df[,1:2]=="a"]<-"bp"
df
# var1 var2 a1 b2
#1 a b bp z
#2 b a z bp
#3 b d z z
您也可以利用相同
的命名约定sel<-paste0("var",1:2)
mut<-paste0("a",1:2)
df[,mut][df[,sel]=="a"]<-"bp"
在任何一种情况下,内部部分,例如df[,sel]=="a"
返回一个与df[,sel]
形状相同的逻辑矩阵(因此形状与df[,mut]
相同),TRUE
只有在存在“a”的地方df[,mut][...]
。外部部分,例如{{1}},使用该逻辑矩阵来指示受赋值的子集。