【问题标题】:Multiple ifelse statement多个 ifelse 语句
【发布时间】:2015-02-03 21:43:10
【问题描述】:

我有下面的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) 当 var1 等于 'a' 时将所有 a1 值替换为 'bp',以及 (2) 当 var2 等于 ' 时将所有 a2 值替换为 'bp'一种'。如果 var1 或 var2 不是“a”,我不想更改该值。

ifelse 命令不是解决此问题的最佳方法吗?我开始使用help$a1[help$a1 == "a"] &lt;- "bp" 手动执行每个操作,但是,这需要一些时间,因为我有多个变量和一个大型数据集。任何帮助都会很棒。

非常感谢。

【问题讨论】:

  • 你有多少替换规则?我的疯狂猜测是,带有规则的补充数据集可能会对您的情况有所帮助,例如var1.rules &lt;- c(a=0,b=1,c=2) 和 var2.rules &lt;- c(a=0,b=1,c=2)
  • 由于需要所有字符向量,我不得不稍微编辑帖子。我有 60 个不同的唯一变量需要在 var1 和 var2 中更改...但不确定这是否能回答您的问题...
  • 你的意思是你的列名看起来像c('var1', 'var2', 'var3',...,'varN', 'a1', a2', 'a3', ..., 'aN'),如果'aX'列中的对应行等于'a,你需要将varX列中的值设置为'bp' ' 对于从 1 到 N 的任何 X?
  • 不确定我是否遵循了这个问题,但 A Webb 下面的答案确实有效......如果这有助于澄清?

标签: r if-statement


【解决方案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 或第 2 列包含 a',则将 df 中的第 3 或第 4 列更改为 'bp'。听起来对吗?
  • @bpace 内部位,df[,1:2]=="a" 返回一个与df[,1:2](因此也就是df[,3:4])形状相同的逻辑矩阵,只有在有“a”的地方才成立.外部位 df[,3:4][...] 是一个逻辑矩阵的子集,只有与矩阵中的 TRUE 值对应的那些条目才会被赋值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 2020-11-12
  • 1970-01-01
  • 2017-03-12
相关资源
最近更新 更多