作为输入数据框
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
答案 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