R数据框中的条件语句

Conditional statement in R dataframe

我有如下数据帧 df。

dput(df)
structure(list(X = c(1, 2, 5, 7, 8), Y = c(3, 5, 8, 7, 2), Z = c(2, 
8, 7, 4, 3), R = c(6, 6, 6, 6, 66)), .Names = c("X", "Y", "Z", 
"R"), row.names = c(NA, -5L), class = "data.frame")
df
class(df)

我必须在两种情况下修改 df。 第一的: 修改 df 以便它检查每行的 X、Y、Z 之间的最小值,取最小值替换为相应的 R 值。 第二种情况: 这是每行中 X、Y、Z、R 之间的最小值,它被替换为 X、Y、Z 和 R 之间的最大值并创建一个新的 df。 我应该怎么得到它? 我尝试了 ifelse 和 if 以及 else 但无法得到我想要的.. 任何帮助将不胜感激。

您可以使用 "df" 的前三个列创建新数据集 "df1"。将 "df1" 与“-1”相乘,使最大值变为 "min"(假设没有负值)。在此示例中,每行的值都是唯一的。因此,您可以使用函数 max.col 并指定 ties.method='first'。它将为您提供每行最大值(此处为最小值)的索引,cbind 它将 1:nrow(df) 创建 "row/column" 索引并提取 [=28= 的元素] 基于该索引 (df1[cbind..]) 并将这些值更改为 "R" 列值 (<- df$R)。然后您可以将原始 "df" 列 ("df[1:3]") 更改为新值。如果每行有多个 "minimum" 值,您可以使用针对第二种情况描述的 "loop" 方法。

 df1 <- df[1:3]
 df1[cbind(1:nrow(df),max.col(-1*df1, 'first'))] <- df$R
 df[1:3] <- df1
 df
 #  X  Y Z  R
 #1 6  3 2  6
 #2 6  5 8  6
 #3 6  8 7  6
 #4 7  7 6  6
 #5 8 66 3 66

创建 "df" (df2) 的副本,使用 pmax 获取每行的 max 值,遍历 "df2" 的行( sapply(seq_len...)) 并将每行中的 "minimum" 值更改为相应的 "max" 值 ("MaxV"),转置 (t) 并将其分配回 "df2" (df2[])

 df2 <- df
 #only use this if there is only a single "minimum" value per row
 # and no negative values in the data 
 #df2[cbind(1:nrow(df), max.col(-1*df2, 'first'))] <- 
  #                                    do.call(pmax, df2)


  MaxV <- do.call(pmax, df2)
  df2 [] <-  t(sapply(seq_len(nrow(df2)), function(i) {
                x <- unlist(df2[i,])
                ifelse(x==min(x), MaxV[i], x)}))

  df2
  #  X  Y  Z  R
  #1 6  3  6  6
  #2 6  8  8  6
  #3 8  8  7  8
  #4 7  7  7  7
  #5 8 66 66 66