我想在使用 .SD, max 时保留字符串。
data <- data.table(id = c("a", "a", "b", "c"),
s1 = c(1, 3, 2, 2),
s2 = c(3, 1, 1, 0),
s3 = c(5, 3, 0, 2),
ta = c("ba", "bb", "cc", "dd"))
out_data <- data[, lapply(.SD, max), by=id]
期望的输出:
id s1 s2 s3 ta
1: a 0 3 5 ba
2: a 3 0 0 bb
3: b 2 1 0 cc
4: c 2 0 2 dd
如何根据id保存ta信息?
最佳答案
我能想到的最好的解决方案是:
colList <- c("s1", "s2", "s3")
out_data <- data[, (colList) := lapply(.SD, function(x) ifelse(x == max(x), x, 0)), by=.(id)]
没有理由指定.SDcols
在这个 build 中。如果您要删除 colList
部分并简单使用.SDcols
它将删除 ta
共列。
编辑:正如 @zx8754 正确指出的那样,这也会改变数据的状态,因为 R 将首先执行 <-
右侧的内容。然后将其分配给 out_data
。您可以通过执行以下操作来防止这种情况:
colList <- c("s1", "s2", "s3")
out_data <- copy(data)[, (colList) := lapply(.SD, function(x) ifelse(x == max(x), x, 0)), by=.(id)]
关于r - 如何计算包含字符串的最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70783655/