[英]Recode based on TRUE or FALSE in another variable
我正在根據另一個的TRUE / FALSE狀態計算一個新變量:
value<-c(2, 4, 5, 8, 2, 3, 1)
tf<-c(TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE)
df<-data.frame(value, tf)
以下代碼可以滿足我的需要(如果'tf'為TRUE,則將'half'值'減半...)
df$newVals[which(df$tf)]<-df$value[which(df$tf)]/2
df$newVals[which(!df$tf)]<-df$value[which(!df$tf)]
......但感覺太復雜了。 有更簡單的方法嗎?
謝謝
這是一個非常簡單的解決方案,沒有ifelse
:
df$newVals <- with(df, value / (tf + 1))
這個怎么運作?
如果布爾值(如tf
)與數學運算符一起使用,則將它們轉換為數值( FALSE
轉換為0
, TRUE
轉換為1
)。 因此,命令tf + 1
創建1
s和2
s的數值向量。 值中的value
除以此新向量中的值。 除以1不會改變原始值。
你可以用ifelse
做到這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))
使用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 <- transform(df, newVals = value) ## task a copy of `value`
df[df$tf, "newVals"] <- df[df$tf, "value"] / 2 ## update only ones we want
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
如果你不喜歡所有的索引,你可以稍微分解一下 - 只需創建包含tf
為TRUE
的行的索引的ind
:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.