使用data.table根据另一列重新分配一列

时间:2019-07-04 00:46:37

标签: r data.table

我有兴趣将“ contra_end”列中的-11值替换为另一列“ current_age”中包含的相应值。 -11是表示当前活动的变量,我想用存储在“ current_age”中的每个人的实际年龄替换该值。年龄具有〜500,000个值,并且第一列中只有〜4,000个值具有值-11。当我运行以下代码以将“年龄段”值分配给“ contra_end”中的-11值时,出现以下错误。我可以在不创建新的年龄变量的情况下完成这项工作吗?

biobank[contra_end == -11, contra_end := biobank[,"current_age", with=FALSE]]

Error in `[.data.table`(biobank, contra_end == -11, `:=`(contra_end, biobank[,  : 
  Supplied 500000 items to be assigned to 4919 items of column 'contra_end'. The RHS length must either be 1 (single values are ok) or match the LHS length exactly. If you wish to 'recycle' the RHS please use rep() explicitly to make this intent clear to readers of your code.

1 个答案:

答案 0 :(得分:0)

我使用了使用此代码制作的简短数据集

biobank <- data.frame(contra_end = c(0,13,15,109,-11,23,45), current_age = c(34,35,36,46,43,56,23))

给出

contra_end current_age 1 0 34 2 13 35 3 15 36 4 109 46 5 -11 43 6 23 56 7 45 23

使用tidyverse::mutate

biobank_2 <- biobank %>% mutate(contra_end = ifelse(contra_end == -11, current_age, contra_end))

或使用base

biobank$contra_end[biobank$contra_end==-11] <- biobank$current_age[biobank$contra_end==-11]

两个选项都给出:

contra_end current_age 1 0 34 2 13 35 3 15 36 4 109 46 5 43 43 6 23 56 7 45 23

编辑:直到发布后,我什至没有注意到您在data.table中寻找解决方案。听起来您对我发布的任何一种解决方案的效率记录都不高,但是效率不够。