R数据帧中的条件语句

时间:2015-01-30 19:48:48

标签: r if-statement 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 if else但是得不到我想要的东西.. 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

 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

创建&#34; df&#34;的副本(df2),使用max获取每行的pmax值,循环遍历&#34; df2&#34; (sapply(seq_len...))并更改&#34;最小值&#34;每行中的值对应&#34; max&#34;值(&#34; MaxV&#34;),转置(t)并将其分配回&#34; df2&#34; (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