回合()还不够

时间:2015-04-19 00:16:24

标签: r

  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"在具有最大小数的类下。如果所有值都低于.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")))

提前致谢。

2 个答案:

答案 0 :(得分:2)

可以使用apply来完成,它将函数应用于数据框或矩阵的每一行。

t(apply(yourdata, 1, function(r) as.numeric(r == max(r))))

这种方式的工作原理是:

  • r == max(r)将创建一个逻辑向量(TRUEFALSE),以了解r中的每个值是否为最高值。
  • as.numeric(r == max(r))TRUEFALSE值分别变为1和0。
  • apply(yourdata, 1, function(r) as.numeric(r == max(r)))将此函数应用于数据框或矩阵的每一行。 1告诉apply将其应用于行(2会将其应用于列。)
  • 最后,apply为原始数据中的每一行返回一列。你想将它转置回来,这就是为什么它被包裹在t

答案 1 :(得分:1)

另一种选择是使用pmax

(df1==do.call(pmax, df1))+0L
#  Class_1 Class_2 Class_3 Class_4 Class_5 Class_6 Class_7 Class_8 Class_9
#[1,]      0       0       0       1       0       0       0       0       0
#[2,]      0       0       0       0       0       1       0       0       0
#[3,]      0       0       0       0       0       1       0       0       0
#[4,]      0       1       0       0       0       0       0       0       0
#[5,]      0       0       0       0       0       0       0       0       1
#[6,]      0       0       1       0       0       0       0       0       0

数据

df1 <- structure(list(Class_1 = c(0.002, 0.012, 0, 0.008, 0.142, 0), 
Class_2 = c(0.326, 0.026, 0, 0.528, 0.004, 0.086), Class_3 = c(0.224, 
0.022, 0, 0.3, 0.002, 0.914), Class_4 = c(0.402, 0.004, 0, 
0.078, 0, 0), Class_5 = c(0.004, 0.01, 0, 0, 0.002, 0), 
Class_6 = c(0.006, 
0.6, 0.994, 0.002, 0.044, 0), Class_7 = c(0.03, 0.024, 0, 
0.008, 0.01, 0), Class_8 = c(0.002, 0.278, 0.004, 0.014, 
0.32, 0), Class_9 = c(0.004, 0.024, 0.002, 0.062, 0.476, 
0)), .Names = c("Class_1", "Class_2", "Class_3", "Class_4", 
"Class_5", "Class_6", "Class_7", "Class_8", "Class_9"),
class = "data.frame", row.names = c(NA, -6L))