如何通过 data.table R 中另一列中的内容 select 列?
How to select the columns by the content in another column in data.table of R?
我有一个 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 条记录列,'a' 列将被提取,而第 3 和 4 条记录将提取列 'b'。 'fix' 将为每条记录保留。理想的输出应该是这样的:
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
您可以使用 .BY
从 .SD
中提取列
dt[, .(fix = fix, new = .SD[[.BY$F]]), 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
一种可能性是对新列的每个元素使用 lapply
:
dt$new = unlist(lapply(1:nrow(dt), function(ii){ return(dt[ii, dt$F[ii]])}))
你也可以
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
如果将其转换为 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
我有一个 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 条记录列,'a' 列将被提取,而第 3 和 4 条记录将提取列 'b'。 'fix' 将为每条记录保留。理想的输出应该是这样的:
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
您可以使用 .BY
从 .SD
dt[, .(fix = fix, new = .SD[[.BY$F]]), 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
一种可能性是对新列的每个元素使用 lapply
:
dt$new = unlist(lapply(1:nrow(dt), function(ii){ return(dt[ii, dt$F[ii]])}))
你也可以
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
如果将其转换为 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