根据另一个变量中的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,这太好了,谢谢。先复制一份,然后更改值-当您看到它时,这是显而易见的。