根据另一个变量中的TRUE或FALSE重新编码

根据另一个变量中的TRUE或FALSE重新编码,r,R,我正在根据另一个变量的真/假状态计算一个新变量: value<-c(2, 4, 5, 8, 2, 3, 1) tf<-c(TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE) df<-data.frame(value, tf) value您可以使用ifelse: value<-c(2, 4, 5, 8, 2, 3, 1) tf<-c(TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE) d

我正在根据另一个变量的真/假状态计算一个新变量:

value<-c(2, 4, 5, 8, 2, 3, 1)
tf<-c(TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE)
df<-data.frame(value, tf)

value您可以使用
ifelse

value<-c(2, 4, 5, 8, 2, 3, 1)
tf<-c(TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE)
df<-data.frame(value, tf)

df$newVals <- with(df, ifelse(tf, value/2, value))
df$newVals <- with(df, value / (tf + 1))

value使用
ifelse
transform
将为您完成此操作

 transform(df, newVals=ifelse(tf, value/2,value))
      value    tf newVals
    1     2  TRUE     1.0
    2     4 FALSE     4.0
    3     5 FALSE     5.0
    4     8 FALSE     8.0
    5     2  TRUE     1.0
    6     3 FALSE     3.0
    7     1  TRUE     0.5

这里有一个非常简单的解决方案,没有
ifelse

value<-c(2, 4, 5, 8, 2, 3, 1)
tf<-c(TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE)
df<-data.frame(value, tf)

df$newVals <- with(df, ifelse(tf, value/2, value))
df$newVals <- with(df, value / (tf + 1))

df$newVals;只需更新需要更改的值,而不是所有值,然后使用
ifelse()
从中进行选择。例如

value<-c(2, 4, 5, 8, 2, 3, 1)
tf<-c(TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE)
df<-data.frame(value, tf)

df <- transform(df, newVals = value) ## task a copy of `value`
df[df$tf, "newVals"] <- df[df$tf, "value"] / 2 ## update only ones we want
df
如果您不喜欢所有的索引,您可以对此进行一些分解-只需创建
ind
,其中包含
tf
TRUE
的行的索引:

df <- transform(df, newVals = value)
ind <- with(df, which(tf))
df[ind, "newVals"] <- df[ind, "value"] / 2
df

> df
  value    tf newVals
1     2  TRUE     1.0
2     4 FALSE     4.0
3     5 FALSE     5.0
4     8 FALSE     8.0
5     2  TRUE     1.0
6     3 FALSE     3.0
7     1  TRUE     0.5

df是的,但是您甚至不需要表达式中的
df$
位[最好不要它们]@Jilber-我以前没有见过转换,需要了解的有用函数。谢谢为了更圆滑,这应该是
df@JoshuaUlrich,我对答案添加了一个解释。@SvenHohenstein-这是一个很好的答案,而且解释真的很有帮助。谢谢你,我个人同意。斯文的回答很聪明,但读起来不如一个好的老掉牙的
ifelse
@SachaEpskamp这是我知道可能的事情,但我不太可能做到。接受了斯文的答案,但这也是一个好答案。谢谢你可以从消除多余的呼叫开始…@Gavinsimpson,这太好了,谢谢。先复制一份,然后更改值-当您看到它时,这是显而易见的。