Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用data.table中的列名选择多个列范围_R_Data.table - Fatal编程技术网

R 使用data.table中的列名选择多个列范围

R 使用data.table中的列名选择多个列范围,r,data.table,R,Data.table,假设我有一个数据表 dt = data.table(matrix(1:50, nrow = 5)); colnames(dt) = letters[1:10]; > dt a b c d e f g h i j 1: 1 6 11 16 21 26 31 36 41 46 2: 2 7 12 17 22 27 32 37 42 47 3: 3 8 13 18 23 28 33 38 43 48 4: 4 9 14 19 24 29 34 39 44 49

假设我有一个数据表

dt = data.table(matrix(1:50, nrow = 5));
colnames(dt) = letters[1:10];

> dt
   a  b  c  d  e  f  g  h  i  j
1: 1  6 11 16 21 26 31 36 41 46
2: 2  7 12 17 22 27 32 37 42 47
3: 3  8 13 18 23 28 33 38 43 48
4: 4  9 14 19 24 29 34 39 44 49
5: 5 10 15 20 25 30 35 40 45 50
我想选择几个不连续的列范围,比如:a,c:d,f:h和j。这可以通过dplyr的select轻松完成:

dt%>%selecta,c:d,f:h,j

我正在寻找一个数据表的方式来实现相同的

现在,我可以按任意顺序分别选择列:dt[,.a,c],或者以startcol:endcol:

dt[,c:f]


但是,我不能将上述两种方法结合起来,在.SDcols中一次选择多个列范围,就像我在dplyr::select中所做的那样。我们可以使用.SDcols中的范围部分,然后通过连接附加另一列

dt[, c(list(a= a), .SD) , .SDcols = c:d]
如果有多个范围,我们将通过匹配创建一系列范围,然后获得相应的列名

i1 <- match(c("c", "f"), names(dt))
j1 <- match(c("d", "h"), names(dt))
nm1 <- c("a", names(dt)[unlist(Map(`:`, i1, j1))], "j")
dt[, ..nm1]
#   a  c  d  f  g  h  j
#1: 1 11 16 26 31 36 46
#2: 2 12 17 27 32 37 47
#3: 3 13 18 28 33 38 48
#4: 4 14 19 29 34 39 49
#5: 5 15 20 30 35 40 50

我们可以使用.SDcols中的范围部分,然后通过连接附加另一列

dt[, c(list(a= a), .SD) , .SDcols = c:d]
如果有多个范围,我们将通过匹配创建一系列范围,然后获得相应的列名

i1 <- match(c("c", "f"), names(dt))
j1 <- match(c("d", "h"), names(dt))
nm1 <- c("a", names(dt)[unlist(Map(`:`, i1, j1))], "j")
dt[, ..nm1]
#   a  c  d  f  g  h  j
#1: 1 11 16 26 31 36 46
#2: 2 12 17 27 32 37 47
#3: 3 13 18 28 33 38 48
#4: 4 14 19 29 34 39 49
#5: 5 15 20 30 35 40 50
这里是一个使用cbind和两个或多个选项的解决方法

cbind(dt[, .(a)], dt[, c:d])
#    a  c  d
# 1: 1 11 16
# 2: 2 12 17
# 3: 3 13 18
# 4: 4 14 19
# 5: 5 15 20
这里是一个使用cbind和两个或多个选项的解决方法

cbind(dt[, .(a)], dt[, c:d])
#    a  c  d
# 1: 1 11 16
# 2: 2 12 17
# 3: 3 13 18
# 4: 4 14 19
# 5: 5 15 20

试试dt[,clista=a,.SD,.SDcols=c:d]@akrun谢谢!这似乎有效,我可以很容易地将其推广到我的案例中。@akrun编辑了问题并提供了进一步的详细信息。请检查更新后的解决方案是否适用于我的案例you@akrun“选择内部dt”看起来简洁而有意义。谢谢你的努力!试试dt[,clista=a,.SD,.SDcols=c:d]@akrun谢谢!这似乎有效,我可以很容易地将其推广到我的案例中。@akrun编辑了问题并提供了进一步的详细信息。请检查更新后的解决方案是否适用于我的案例you@akrun“选择内部dt”看起来简洁而有意义。谢谢你的努力!只是想知道上述方法如何处理多组分组:dt=data.tablematrix1:50,nrow=5;colnamesdt=字母[1:10];我想选择列:a,c:d,g:h和j。有什么想法吗?选择多个列的首选方法是什么?unlist/Map或dplyr::select?@eksage select有更多选项,只是想知道上述方法如何处理多组分组:dt=data.tablematrix1:50,nrow=5;colnamesdt=字母[1:10];我想选择列:a,c:d,g:h和j。有什么想法吗?选择多个列的首选方法是什么?取消列表/映射或dplyr::select?@eksage select有更多选项