根据行值比较列并保持最大

时间:2019-02-18 13:56:33

标签: r

作为输入数据框

dframe <- structure(list(com = structure(1:2, .Label = c("col1", "em"), class = "factor"), 
    stock1 = c(2.6, 2.05), aim = c(1.55, 3.1)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -2L))

如何根据value列中的每两个列中的两个值比较两行,并保持最大的一列,并在较低的一列中插入零?

以下是预期输出的示例

> data.frame (com = c("col1","em"), stock1 = c(2.6, 0), aim = c(0,3.10))
   com stock1 aim
1 col1    2.6 0.0
2   em    0.0 3.1

3 个答案:

答案 0 :(得分:2)

如果您不打算使用tibble而是使用data.frame,则可以这样做

dat <- as.data.frame(dframe)

cols <- c("stock1", "aim")
dat[, cols][cbind(1:nrow(dat),
                  max.col(-dat[, cols]))] <- 0 
dat
#   com stock1 aim
#1 col1    2.6 0.0
#2   em    0.0 3.1

显然,您不能使用矩阵从tibble中提取/替换值。

答案 1 :(得分:2)

还有一个基本的R可能性:

cbind(dframe[, 1], dframe[, -1] * apply(dframe[, -1], 1, function(x) x == max(x)))

   com stock1 aim
1 col1    2.6 0.0
2   em    0.0 3.1

答案 2 :(得分:1)

for (i in 1:nrow(dframe)){
  min=which.min(dframe[i,-1])
  dframe[i,min+1]=0
}
> dframe
# A tibble: 2 x 3
  com   stock1   aim
  <fct>  <dbl> <dbl>
1 col1     2.6   0  
2 em       0     3.1