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