繁体   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