用 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
我有一个包含三列的数据框 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