Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用R中的现有值替换数据框中的最大值和最小值_R_Dataframe_Replace_Apply - Fatal编程技术网

用R中的现有值替换数据框中的最大值和最小值

用R中的现有值替换数据框中的最大值和最小值,r,dataframe,replace,apply,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 我想做的是用其他特定值替换每行的每个最大值和最小值 因此,我所做的是创建另一个具有新列的数据框,以便将这些列用作“其他特定值” 以下是输出:

我想这是一项简单的任务,但因为我对这个世界还不熟悉,所以这个问题对我来说更大

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

有什么想法吗?

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

# 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
#找出最大值和最小值的行和列索引

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

# 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
#找出最大值和最小值的行和列索引

max_pos使用
apply
遍历每一行,根据需要替换max和min值,然后重新打包为数据帧

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

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

df我们可以使用向量化的
max.col
找到每行最大值的列索引(在第二种情况下,我们乘以
-1
,这样索引将对应于最小值),
cbind
使用行索引获取行/列索引的
矩阵
,该矩阵可用于提取数据集的值,并使用减法或加法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

j1我们可以使用向量化的
max.col
找到每行最大值的列索引(在第二种情况下,我们乘以
-1
,这样索引将对应于最小值),
cbind
使用行索引获取行/列索引的
矩阵
,该矩阵可用于提取数据集的值,并使用减法或加法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

这正是我想要的。谢谢大家!@这正是我想要的。谢谢大家!@贾森旺