用R中另一个数据框的特定值替换行中的值

时间:2020-06-26 13:13:38

标签: r replace minimum

我有一个数据框 df df dataframe,其中包含三列:ID,范围和Min_Range(这最后一列是我要查找的结果)。 我想通过将df $ Range中的非NA值替换为来自Min_Range_df数据帧Min_Range_df dataset的相应(至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")

谢谢!

2 个答案:

答案 0 :(得分:1)

首先获得Min_Range_df

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

  ID Range
1  1    10
2  2    30
3  3    40

然后用它来创建新列

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

答案 1 :(得分:0)

您可以使用dplyr

df %>%
  group_by(ID) %>%
  mutate(Min_Range_New = ifelse(is.na(Range), NA, min(Range, na.rm=TRUE)))

返回

      ID Range Min_Range Min_Range_New
   <dbl> <dbl>     <dbl>         <dbl>
 1     1    10        10            10
 2     1    15        10            10
 3     1    20        10            10
 4     2    30        30            30
 5     2    35        30            30
 6     3    40        40            40
 7     3    45        40            40
 8     3    50        40            40
 9     3    NA        NA            NA
10     4    NA        NA            NA
11     4    NA        NA            NA