[英]Replace max and min values in data frame with existing values in R
我想這是一件容易的事,但是因為我是這個世界的新手,所以對我來說問題更大。
我有這個初始data.frame:
> df
a b c
1 -0.05 0.31 0.62
2 0.78 0.25 -0.01
3 0.68 0.33 -0.04
4 -0.01 0.30 0.56
5 0.55 0.28 -0.03
我想要做的是用其他特定值替換每行的每個最大值和最小值。
因此,我要做的是使用新列創建另一個數據框,以便將其用作“其他特定值”
這是輸出:
df_2 <- df
df_2$Rep_MAX <- apply(df_2, 1, max) - 0.1
df_2$Rep_MIN <- apply(df_2, 1, min) + 0.1
print(df_2)
a b c Rep_MAX Rep_MIN
1 -0.05 0.31 0.62 0.52 0.05
2 0.78 0.25 -0.01 0.68 0.09
3 0.68 0.33 -0.04 0.58 0.06
4 -0.01 0.30 0.56 0.46 0.09
5 0.55 0.28 -0.03 0.45 0.07
我想將“ Rep_MAX”設置為每個最大行值,並將“ Rep_MIN”設置為每個最小行值。
這是我想要的輸出:
a b c
1 0.05 0.31 0.52
2 0.68 0.25 0.09
3 0.58 0.33 0.06
4 0.09 0.30 0.46
5 0.45 0.28 0.07
有任何想法嗎?
我的想法是找出最大值和最小值在每一行中的位置並將其替換:
# Find out the row and column index for maximum and minimum value
max_pos <- matrix(c(1:nrow(df), apply(df, 1, which.max)), ncol=2)
min_pos <- matrix(c(1:nrow(df), apply(df, 1, which.min)), ncol=2)
# Replace them
df[max_pos] <- df[max_pos] - 0.1
df[min_pos] <- df[min_pos] + 0.1
df
a b c
1 0.05 0.31 0.52
2 0.68 0.25 0.09
3 0.58 0.33 0.06
4 0.09 0.30 0.46
5 0.45 0.28 0.07
df <- structure(list(a = c(-0.05, 0.78, 0.68, -0.01, 0.55), b = c(0.31,
0.25, 0.33, 0.3, 0.28), c = c(0.62, -0.01, -0.04, 0.56, -0.03
)), .Names = c("a", "b", "c"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5"))
使用apply
遍歷每一行,並適當替換最大值和最小值,然后將其重新打包為數據框
df <- data.frame(a=c(-0.05,0.78,0.68,-.01,0.55),
b=c(0.31,0.25,0.33,0.30,0.28),
c=c(0.62,-0.01,-0.04,0.56,-0.03))
df2 <- as.data.frame(t(apply(df,1,function(r) {r[which.min(r)] <- r[which.min(r)]+0.1
r[which.max(r)] <- r[which.max(r)]-0.1
return(r)})))
df2
a b c
1 0.05 0.31 0.52
2 0.68 0.25 0.09
3 0.58 0.33 0.06
4 0.09 0.30 0.46
5 0.45 0.28 0.07
我們可以使用向量化的max.col
來找到每一行的最大值的列索引(在第二種情況下,我們乘以-1
因此索引將對應於最小值), cbind
與行索引cbind
以獲得matrix
行/列索引的索引,可用於提取數據集的值並通過減去或增加0.1進行更新
j1 <- cbind(1:nrow(df), max.col(df, 'first'))
j2 <- cbind(1:nrow(df), max.col(-df, 'first'))
df[j1] <- df[j1]- 0.1
df[j2] <- df[j2] + 0.1
df
# a b c
#1 0.05 0.31 0.52
#2 0.68 0.25 0.09
#3 0.58 0.33 0.06
#4 0.09 0.30 0.46
#5 0.45 0.28 0.07
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.