簡體   English   中英

根據R中另一列中的數據創建一個布爾列

[英]Create a boolean column based on data in another column in R

我有一個數據集,想做兩件事:

  1. 根據列B中的值將列A中的某些行值設置為0

  2. 根據列A中的編輯值,創建一個值為0或1的新列

我當前的方法如下所示-問題是我偶爾會遇到錯誤:

Error in `[<-.data.frame`(`*tmp*`, "OCS_dose", value = 0) : 
  replacement has 1 row, data has 0

由於我正在生成的數字是隨機選擇的,並且在某些試驗中,基於A列中的數字,A列中沒有要更新的行。

這是導致錯誤的代碼示例:

pbo_IFNlow_data[pbo_IFNlow_data$OCS_status == 0,]['OCS_dose'] <- 0

OCS_status是使用以下命令生成的0或1:

pbo_OCS_status_low <- sample(c(0,1), replace = TRUE,
                             size = pbo_n_IFNlow, prob=c(1-.863, 0.863))

因此,有時候我沒有0。。。在我看來R應該不嘗試更新任何東西。

有沒有更好的方法來做我想做的事情?

這是我的代碼的更完整的部分:

  pbo_OCS_status_low <- sample(c(0,1), replace = TRUE, size = pbo_n_IFNlow, prob=c(1-.863, 0.863)) #on OCS = 1

  #OCS dose
  pbo_OCS_dose_low <- rtruncnorm(pbo_n_IFNlow, a=0, b=Inf, mean=12.8, sd=8.1)

  #IFN boolean flag
  pbo_IFN_low <- rep(0, pbo_n_IFNlow)

  #SLEDAI score 
  pbo_SLEDAI_low <- rtruncnorm(pbo_n_IFNlow, a=0, b=Inf, mean=11.1, sd=4.4)

  #Response criteria met for SRI score reduction
  pbo_SRI_low <- sample(c(0,1), replace = TRUE, size = pbo_n_IFNlow, prob=c(1-0.423, 0.423))


  pbo_IFNlow_data <- cbind(IFN_status=pbo_IFN_low,
                           OCS_status=pbo_OCS_status_low,
                           OCS_dose=pbo_OCS_dose_low,
                           SLEDAI=pbo_SLEDAI_low,
                           SRI_response=pbo_SRI_low)

  pbo_IFNlow_data <- data.frame(pbo_IFNlow_data)

  #set those off OCS to 0
  pbo_IFNlow_data[pbo_IFNlow_data$OCS_status == 0,]['OCS_dose'] <- 0


  #stratifcation factor for OCS dosage
  pbo_IFNlow_data$OCS_lessthan10 <- "temp"
  pbo_IFNlow_data[pbo_IFNlow_data$OCS_dose < 10, ]['OCS_lessthan10'] <- 1
  pbo_IFNlow_data[pbo_IFNlow_data$OCS_dose >= 10, ]['OCS_lessthan10'] <- 0


  #stratification factor for SLE score
  pbo_IFNlow_data$SLE_lessthan10 <- "temp"
  pbo_IFNlow_data[pbo_IFNlow_data$SLEDAI < 10, ]['SLE_lessthan10'] <- 1
  pbo_IFNlow_data[pbo_IFNlow_data$SLEDAI >= 10, ]['SLE_lessthan10'] <- 0

如果我們能有一個最小的可重現的例子,那會更容易。 如果我正確理解了您的問題,則可能要嘗試在R中使用ifelse語句?

df <- data.frame(colA = seq(1, 10), colB = seq(11, 20))

# Set certain row values in Col A to 0 based on values in Col B
df$colA <- ifelse(df$colB > 15, 0, df$colB)

# Create a new column with values of either 0 
# or 1 based on the edited values in Col A
df$colC <- ifelse(df$colA == 0, 1, 0)

print(df)

##       colA colB colC
##    1    11   11    0
##    2    12   12    0
##    3    13   13    0
##    4    14   14    0
##    5    15   15    0
##    6     0   16    1
##    7     0   17    1
##    8     0   18    1
##    9     0   19    1
##    10    0   20    1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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