首页 > 解决方案 > 使用 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.

标签: rdata.table

解决方案


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

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编辑:在我发布之前,我什至没有注意到您正在寻找解决方案。不过,对于我发布的任何一种解决方案来说,这听起来都没有太多的记录,但效率不够。


推荐阅读