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

Replace values from rows with specific values from another dataframe in R

我有一个包含三列的数据框 df df dataframe:ID、范围和 Min_Range(最后一列是我正在查找的结果为了)。 我想通过将 df$Range 中的非 NA 值替换为 Min_Range 中对应的(到 ID)Min_Range_df$Min_Range 值来获取 df$Min_Range 列_df 数据帧 Min_Range_df dataset。 另一种看待它的方法是,我想按组 (ID) 获取最小 df$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")

谢谢!!

首先获得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

您可以使用 dplyr:

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

哪个returns

      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