我在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
答案 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])
}