将数据框中的max和min值替换为R中的现有值

时间:2017-04-19 05:25:46

标签: r dataframe replace apply

我想这是一件容易的事,但因为我是这个世界的新手,问题对我来说更大。

我有这个初始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

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我的想法是找出每行中最大值和最小值的位置并替换它们:

# 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"))

答案 1 :(得分:1)

使用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

答案 2 :(得分:1)

我们可以使用向量化max.col来查找每个行的最大值的列索引(在第二种情况下,我们乘以-1,因此索引将对应于最小值),{ {1}}使用行索引获取cbind行/列索引,可用于提取数据集的值并使用减去或添加0.1来更新它

matrix