Class_1 Class_2 Class_3 Class_4 Class_5 Class_6 Class_7 Class_8 Class_9
0.002 0.326 0.224 0.402 0.004 0.006 0.030 0.002 0.004
0.012 0.026 0.022 0.004 0.010 0.600 0.024 0.278 0.024
0.000 0.000 0.000 0.000 0.000 0.994 0.000 0.004 0.002
0.008 0.528 0.300 0.078 0.000 0.002 0.008 0.014 0.062
0.142 0.004 0.002 0.000 0.002 0.044 0.010 0.320 0.476
0.000 0.086 0.914 0.000 0.000 0.000 0.000 0.000 0.000
你好。上面的 df 是我正在使用的。我想对每一行进行四舍五入,以便每一行在具有最大小数的类下恰好有一个“1”。如果所有值都低于 0.5,则使用 round() 函数会使所有行条目都为 0;例如,使用 round() 时第一行全为 0,因为所有行都使用 round() 向下舍入。看来我必须使用 if 语句。
> dput(head(demo56.pred))
structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(6L,
9L), .Dimnames = list(c("1", "2", "3", "4", "5", "6"), c("Class_1",
"Class_2", "Class_3", "Class_4", "Class_5", "Class_6", "Class_7",
"Class_8", "Class_9")))
提前致谢。
最佳答案
这可以通过 apply 来完成,它将函数应用于数据框或矩阵的每一行。
t(apply(yourdata, 1, function(r) as.numeric(r == max(r))))
其工作原理是:
-
r == max(r)
将创建一个逻辑向量(TRUE
和FALSE
),关于r
中的每个值是否是最高的。 -
as.numeric(r == max(r))
变成TRUE
和FALSE
值分别为 1 和 0。 -
apply(yourdata, 1, function(r) as.numeric(r == max(r)))
将此函数应用于数据框或矩阵的每一行。1
告诉apply
将其应用于行(2
会将其应用于列)。 - 最后,
apply
为原始数据中的每一行返回一列。您想将其转置回来,这就是它被包裹在t
中的原因.
关于Round() 还不够,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29724358/