我有以下data.table:
dat<-data.table(Y=as.factor(c("a","b","a")),"a"=c(1,2,3),"b"=c(3,2,1))
看起来像:
Y a b
1: a 1 3
2: b 2 2
3: a 3 1
我想要的是将Y值表示的列的值减去1。第一行的Y值为“a”,因此第一行中“a”列的值应减1。 结果应该是:
Y a b
1: a 0 3
2: b 2 1
3: a 2 1
这可能吗?如果有,怎么样?谢谢!
答案 0 :(得分:4)
使用自我加入和get
:
for (yval in dat[ , unique(Y)]){
dat[yval, (yval) := get(yval) - 1L, on = "Y"]
}
dat[]
# Y a b
# 1: a 0 3
# 2: b 2 1
# 3: a 2 1
答案 1 :(得分:2)
我们可以使用melt/dcast
来执行此操作。创建行序列(&#39; N&#39;)到&#39; long&#39;之后的数据集melt
格式,从&#39;值&#39;中减去1列&#39; Y&#39;和&#39;变量&#39;元素相等,将(:=
输出分配给&#39;值&#39;,然后将dcast
&#39;格式&#39;格式&#39;分配。 / p>
dcast(melt(dat[, N := 1:.N], id.var = c("Y", "N"))[Y==variable,
value := value -1], N + Y ~variable, value.var = "value")[, N := NULL][]
# Y a b
#1: a 0 3
#2: b 2 1
#3: a 2 1
答案 2 :(得分:0)
首先使用apply函数进行实际转换。我们需要按行应用然后使用第一个元素命名第二个元素来访问和重写。出于某种原因,我在a
和b
中访问的值是字符串,因此我使用as.numeric
将它们转换为数字。由于我不能正常使用data.table
,因此我不知道data.table
中的这种情况是否正常,或者是否因为使用了适用语句而导致结果正常。
tformDat <- apply(dat, 1, function(x) {x[x[1]] <- as.numeric(x[x[1]]) - 1;x})
然后您需要重新格式化回原始的data.table
格式
data.table(t(tformDat))
整个事情可以在一行中完成。
data.table(t(apply(dat, 1, function(x) {x[x[1]] <- as.numeric(x[x[1]]) - 1;x})))