R在多个数据表列中搜索

Dan*_*iar 4 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))
Run Code Online (Sandbox Code Playgroud)

然后我想找到包含颜色'yellow'的任何行的最高分数:

max_score <- max(x[colour1 == 'yellow' | colour2 == 'yellow' | colour3 == 'yellow']$score)
Run Code Online (Sandbox Code Playgroud)

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

tal*_*lat 7

这可能会让您觉得困难,因为您的数据是宽泛的(即"不整齐")格式.只需转换为长格式使用melt,它非常简单.

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

要么

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

要查看发生了什么,请先运行此操作

melt(x, measure.vars = grep("^colo", names(x)))
Run Code Online (Sandbox Code Playgroud)

然后是整个命令.


当然,如果你想保留长格式以便进一步计算,你也可以分两步完成:

x_tidy <- melt(x, measure.vars = grep("^colo", names(x)))
x_tidy[value == "yellow", max(score)]
#[1] 0.7
Run Code Online (Sandbox Code Playgroud)