我有一个数据框 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")
谢谢!
答案 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