首页 > 解决方案 > 用 R 中另一个数据框的特定值替换行中的值

问题描述

我有一个包含三列的数据框df df 数据框:ID、Range 和 Min_Range(最后一列是我要查找的结果)。我想通过将 df$Range 中的非 NA 值替换为 Min_Range_df 数据帧Min_Range_df 数据集的相应(到 ID)Min_Range_df$Min_Range 值来获取 df$Min_Range 列。另一种看待它的方法是,我想按组 (ID) 获取最小值 df$Range 并用最小值替换 Range 值。

df <- matrix(data=c(1,1,1,2,2,3,3,3,3,4,4,10,15,20,30,35,40,45,50,NA,NA,NA,10,10,10,30,30,40,40,40,NA,NA,NA), ncol = 3)
colnames(df) <- c("ID", "Range", "Min_Range")

Min_Range_df <- matrix(data= c(1,2,3,10,30,40), ncol=2)
colnames(Min_Range_df) <- c("ID", "Min_Range")

谢谢!!

标签: rreplaceminimum

解决方案


First to get the Min_Range_df

Min_Range_df <- aggregate(Range ~ ID, df, min)

  ID Range
1  1    10
2  2    30
3  3    40

Then using it to make your new column

df[,"Min_Range"] <- NA
df[,"Min_Range"][!is.na(df[,"Range"])] <- unlist(lapply(df[,"ID"][!is.na(df[,"Range"])], function(x) Min_Range_df$Range[grep(x,Min_Range_df$ID)]))

      ID Range Min_Range
 [1,]  1    10        10
 [2,]  1    15        10
 [3,]  1    20        10
 [4,]  2    30        30
 [5,]  2    35        30
 [6,]  3    40        40
 [7,]  3    45        40
 [8,]  3    50        40
 [9,]  3    NA        NA
[10,]  4    NA        NA
[11,]  4    NA        NA

推荐阅读