根据R

时间:2018-08-17 18:24:20

标签: r

我有一个数据集,想做两件事:

  1. 根据Col B中的值将Col A中的某些行值设置为0

  2. 根据Col 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

1 个答案:

答案 0 :(得分:1)

如果我们可以提供一个最小的可复制示例,则将更加容易。如果我正确理解了您的问题,则可能要尝试使用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