我的数据帧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但是得不到我想要的东西.. 任何帮助将不胜感激。
答案 0 :(得分:0)
您可以创建新数据集" df1"与#34; df"的前三个coumns。乘以" df1"用" -1"以便最大值变为" min" (假设没有负值)。这里,在示例中,每行的值都是唯一的。因此,您可以使用函数max.col
并指定ties.method='first'
。它将为您提供每行的最大值索引(此处为最小值),cbind
1:nrow(df)
将创建"行/列"索引并提取" df1"的元素。基于该索引(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