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)
在这个例子中,上面的代码工作正常但是有更好的方法来检查多个列的这种情况吗?在实践中,表格会更大,列数可以改变,所以我想动态地这样做.
这可能会让您觉得困难,因为您的数据是宽泛的(即"不整齐")格式.只需转换为长格式使用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)