簡體   English   中英

在另一個變量中基於TRUE或FALSE重新編碼

[英]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轉換為0TRUE轉換為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))

使用ifelsetransform將為您完成

 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

如果你不喜歡所有的索引,你可以稍微分解一下 - 只需創建包含tfTRUE的行的索引的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM