如何根据R的data.table中另一列中的内容选择列?

时间:2015-03-16 15:09:48

标签: r data.table

我有一个像这样的data.table:

> dt<-data.table(F=rep(c('a','b','c'),each=2), fix=c(10:15),a=c(1:6), b=c(2:7),c=c(3:8))
> dt
   F fix a b c
1: a  10 1 2 3
2: a  11 2 3 4
3: b  12 3 4 5
4: b  13 4 5 6
5: c  14 5 6 7
6: c  15 6 7 8

列F存储要为每行提取的列。因此,对于前2个记录列,列&#39; a&#39;将在列&#39; b&#39;将被提取为3和4记录。修复&#39;将保留每个记录。理想的输出应该是这样的:

   F  fix new
1: a  10   1 
2: a  11   2
3: b  12   4
4: b  13   5
5: c  14   7
6: c  15   8

4 个答案:

答案 0 :(得分:5)

您可以将.SDwith = FALSE

一起使用
dt[, .(fix = fix, new = unlist(.SD[, F, with=FALSE])), by = F]
##    F fix new
## 1: a  10   1
## 2: a  11   2
## 3: b  12   4
## 4: b  13   5
## 5: c  14   7
## 6: c  15   8

答案 1 :(得分:2)

您也可以

 melt(dt, id.var=c('F', 'fix'), value.name='new')[F==variable][, 
                         variable:=NULL][]
 #   F fix    new
 #1: a  10     1
 #2: a  11     2
 #3: b  12     4
 #4: b  13     5
 #5: c  14     7
 #6: c  15     8

答案 2 :(得分:1)

一种可能性是将lapply用于新列的每个元素:

dt$new = unlist(lapply(1:nrow(dt), function(ii){ return(dt[ii, dt$F[ii]])}))

答案 3 :(得分:1)

如果将其转换为data.frame,则可以使用以下内容:

> x <- as.data.frame(dt)
> within(x, new <- x[cbind(1:6, match(x$F, names(x)))])[,c(1,2,6)]
  F fix new
1 a  10   1
2 a  11   2
3 b  12   4
4 b  13   5
5 c  14   7
6 c  15   8