R在多个数据表列中搜索

时间:2016-06-22 10:34:56

标签: r dataframe data.table

我需要根据多个列的条件对data.table进行子集化,然后对结果执行操作。

带有简单data.table的最小示例:

x <- data.table(id=c(1, 2, 3, 4), colour1 = c('red', 'green', 'green', 'blue'), 
                colour2 = c('yellow', 'red', 'blue', 'black'), 
                colour3 = c('blue', 'black', 'red', 'yellow'),
                score = c(0.7, 0.9, 0.2, 0.35))

然后,我想找到包含颜色的任何行的最高分数&#39;黄色&#39;:

max_score <- max(x[colour1 == 'yellow' | colour2 == 'yellow' | colour3 == 'yellow']$score)

在这个例子中,上面的代码工作正常,但是有更好的方法可以跨多个列检查这个条件吗?在实践中,表格会更大,列数可以改变,所以我想动态地这样做。

5 个答案:

答案 0 :(得分:7)

由于您的数据采用广泛(即“不整齐”)的格式,因此可能会感到困难。只需使用reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\UIPI /ve /f /d "0x00000001 (1)" reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v FilterAdministratorToken /t REG_DWORD /d 1 /f 转换为长格式,这非常简单。

melt

melt(x, measure.vars = grep("^colo", names(x)))[,max(score[value == "yellow"])]
# [1] 0.7

要查看正在发生的事情,请先运行

melt(x, measure.vars = grep("^colo", names(x)))[value == "yellow", max(score)]

然后整个命令。

当然,您也可以分两步完成,以防您想要保留长格式以进行进一步的计算:

melt(x, measure.vars = grep("^colo", names(x)))

答案 1 :(得分:2)

使用rowSums:

max(
  x[ rowSums(x[, grepl("colour", colnames(x)), with = FALSE] == "yellow") > 0,
     "score", with = FALSE]
  )

答案 2 :(得分:1)

使用R computing on the language功能。

i.cols.equal <- function(cols, value) {
    l <- lapply(cols, function(col) call("==", as.name(col), value))
    Reduce(function(a, b) bquote(.(a) | .(b)), l)
}
ii <- i.cols.equal(cols=c("colour1", "colour2", "colour3"), value="yellow")
print(ii)
#colour1 == "yellow" | colour2 == "yellow" | colour3 == "yellow"
x[eval(ii), max(score)]
#[1] 0.7

答案 3 :(得分:1)

原生 R

y=data.frame(x)
max(y$score[apply(y[,grep("^colo", colnames(y))]=="yellow",1,any)])

[1] 0.7

答案 4 :(得分:1)

另一个类似于jangorecki的想法(可能更直接)是简单地循环遍历行的“逻辑”向量的列,以检查max中的x[["score"]]以节省一些内存使用量:

i = logical(nrow(x))
for(j in which(startsWith(names(x), "colour"))) i = i | x[[j]] == "yellow" 
max(x[["score"]][i])
#[1] 0.7