Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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数据表:移动列表类型的行_R_Data.table - Fatal编程技术网

R数据表:移动列表类型的行

R数据表:移动列表类型的行,r,data.table,R,Data.table,我有一个带有列表的data.table类型: x = data.table(k = seq(1:5), l = list(c(4,5))) > x k l 1: 1 4,5 2: 2 4,5 3: 3 4,5 4: 4 4,5 5: 5 4,5 我现在尝试将l值移动1: x[, m:=shift(l, 1)] > x k l m 1: 1 4,5 NA, 4 2: 2 4,5 NA, 4 3: 3 4,5 NA, 4 4: 4 4,5 NA, 4 5:

我有一个带有
列表的data.table
类型:

x = data.table(k = seq(1:5), l = list(c(4,5)))
> x
   k   l
1: 1 4,5
2: 2 4,5
3: 3 4,5
4: 4 4,5
5: 5 4,5
我现在尝试将
l
值移动
1

x[, m:=shift(l, 1)]
> x
   k   l     m
1: 1 4,5 NA, 4
2: 2 4,5 NA, 4
3: 3 4,5 NA, 4
4: 4 4,5 NA, 4
5: 5 4,5 NA, 4
这会在列表中产生一个移位,而不是在列表之间。(旁白:不清楚为什么行
2-5
会出现
NA
) 有什么办法可以得到这样的东西:

x[magic]
> x
   k   l  m
1: 1 4,5 NA
2: 2 4,5 4,5
3: 3 4,5 4,5
4: 4 4,5 4,5
5: 5 4,5 4,5

使用
shift
,一个选项是获取'l'序列上的
shift
,根据该序列将'l'子集,并将其分配给新列'm'。默认情况下,
shift
返回
fill=NA
。因此,这些元素将在“m”中
NULL
,我们可以
将其替换为
NA
(如果需要),或者使用
is.NULL
也可以轻松删除这些元素

x[, m := l[shift(seq_along(l))]][, m := lapply(m, function(x) 
          replace(x, is.null(x), NA))]
x
#   k   l   m
#1: 1 4,5  NA
#2: 2 4,5 4,5
#3: 3 4,5 4,5
#4: 4 4,5 4,5
#5: 5 4,5 4,5
或者,正如@Frank所提到的,我们可以在“i”中指定逻辑索引,同时将“m”更新为
NA\u real\uuu
,只针对“i”中指定的元素子集,这样会更有效

x[, m := l[shift(seq_along(l))]][sapply(m, is.null), m := .(.(NA_real_))]

或者,以一种简洁的方式,我们可以将
fill
更改为
0
,并在开始处追加
NA
。如果
shift
大于1,请使用
rep
复制NA并在开头追加

x[,  m:= c(NA, l[shift(seq_along(l), fill = 0)])]

您可以使用手动换档,如下所示

x[, m := c(NA_real_, head(l, -1L))]
导致

对于更大的转换,您可以使用自己的函数

mshift <- function(var, n) c(NA[1:n], head(var, -n))
根据原始数据


显然,此功能非常基本,只会向右(向下)移动。如果您愿意,可以调整函数,使其向相反方向移动,并添加一些类检查/匹配

谢谢你的回答,但我喜欢@Richard的简单。你对你的答案评价更高吗?@jacquard我之所以选择此选项,是因为你的问题是关于使用
shift
,否则,我会选择更简单的选项。好的,我的问题一般与移位有关。请参阅我问题中的
magic
参考。我选择@Richard的答案作为被接受的答案,因为它很简单。干杯@jacquard对此没有问题。可能是
NA_real\uuu
来匹配其余部分。@Frank-我想是的,尽管列表元素通常不相关。从一个。
mshift <- function(var, n) c(NA[1:n], head(var, -n))
x[, m := mshift(l, 2)]
   k   l   m
1: 1 4,5  NA
2: 2 4,5  NA
3: 3 4,5 4,5
4: 4 4,5 4,5
5: 5 4,5 4,5