R data.table获取多列的每行最大值

时间:2016-05-10 15:45:05

标签: r data.table

我在R中有一个data.table,看起来像那个:

dat <- structure(list(de = c(1470L, 8511L, 3527L, 2846L, 2652L, 831L
), fr = c(14L, 81L, 36L, 16L, 30L, 6L), it = c(9L, 514L, 73L, 
37L, 91L, 2L), ro = c(1L, 14L, 11L, 1L, 9L, 0L)), .Names = c("de", 
"fr", "it", "ro"), class = c("data.table", "data.frame"), row.names = c(NA, 
-6L))

我现在想创建一个新的data.table(具有完全相同的列)但只保留每行的最大值。其他列中的值应该只是NA。

data.table可以有任意数量的列(上面的data.table只是一个例子)。

所需的输出表如下所示:

     de fr it ro
1: 1470 NA NA NA
2: 8511 NA NA NA
3: 3527 NA NA NA
4: 2846 NA NA NA
5: 2652 NA NA NA
6:  831 NA NA NA

2 个答案:

答案 0 :(得分:3)

OP在这里尝试的内容有几个问题:(1)这看起来确实应该将数据保存在矩阵而不是data.frame或data.table中; (2)没有理由想要我能想到的这种输出; (3)对输出进行任何标准操作都会很麻烦。

据说......

dat2 = dat
is.na(dat2)[-( 1:nrow(dat) + (max.col(dat)-1)*nrow(dat) )] <- TRUE
# or, as @PierreLafortune suggested
is.na(dat2)[col(dat) != max.col(dat)] <- TRUE

# or using the data.table package
dat2 = dat[rep(NA_integer_, nrow(dat)), ]
mc   = max.col(dat)
for (i in seq_along(mc)) set(dat2, i = i, j = mc[i], v = dat[i, mc[i]])

答案 1 :(得分:1)

我不清楚您是否想要使用data.table包,或者如果您对仅使用基本函数创建data.frame感到满意。当然可以做后者。

这是一个解决方案,它只使用max()和which.max(),并依赖于一个空的data.frame将用NA填充所有剩余单元格以实现矩形结构的事实。

maxdat <- data.frame()
  for (col in names(dat)) {
  maxdat[which.max(dat[,col]), col] <- max(dat[,col])
}