在数据表中创建包含更多行的新列

时间:2018-04-19 12:26:30

标签: r data.table

我想我应该编辑这个例子,因为它有误导性。很抱歉给您带来不便:(

以下是我面临的警告示例:

dsf <- data.table(v1=c('a','a','b','b','b','c'),v2=c(3,5,8))
> dsf
   v1 v2
1:  a  3
2:  a  5
3:  b  8
4:  b  3
5:  b  5
6:  c  8

我想添加一个新列来生成

   v1 v2  v3
1:  a  3  5 
2:  a  5  7
3:  NA NA 4
4:  b  8  6
5:  b  3  9
6:  b  5  4
7:  NA NA 4
8:  c  8  7
9:  NA NA 9

但我收到一条警告信息:

  

[.data.table中(dsf ,, :=(v3,c(1:4))):     提供4个项目分配给'v3'栏中的3个项目(1个未使用)

,数据表为:

   v1 v2  v3
1:  a  3  5 
2:  a  5  7
3:  b  8  6
4:  b  3  9
5:  b  5  4
6:  c  8  7

在最初的情况下 - 我正在研究 - 我有这样的事情:

dsf <- dsf[, v3:=f(list(v2)) , by=list(v1)]

函数f创建一个额外的值。

3 个答案:

答案 0 :(得分:3)

看起来conda install -c conda-forge keras包中的cbind.fill函数可能很有用:

rowr

或者,您可以尝试将两者合并在一起。类似的东西:

data.table(rowr::cbind.fill(dsf, data.table(v3 = c(1:4)), fill = NA))
#   v1 v2 v3
#1:  a  3  1
#2:  a  5  2
#3:  b  8  3
#4: NA NA  4

答案 1 :(得分:0)

使用此功能

myfun <- function(df, vec) {
    L <- c(as.list(df), v3 = list(vec))
    result <- lapply(L, `length<-`, max(lengths(L)))
    do.call(cbind.data.frame, result)
}

myfun(dsf, 1:4)

    # v1 v2 v3
# 1    a  3  1
# 2    a  5  2
# 3    b  8  3
# 4 <NA> NA  4

答案 2 :(得分:0)

也许,我的回答并不好看,但这对我来说已经足够了...... 感谢Stack Overflow :)

dsf <- data.table(v1=c('a','a','b','b','b','c'),v2=c(3,5,8))

dsf2 <- unique(as.data.frame(dsf[,1]))
dsf2$v2 <- NA

dsf <- rbind(dsf,dsf2)
dsf <- arrange(dsf,v1)
dsf <- dsf[, v3:=c(1:length(v2)), by=list(v1)]
>dsf
   v1 v2 v3
1:  a  3  1
2:  a  5  2
3:  a NA  3
4:  b  8  1
5:  b  3  2
6:  b  5  3
7:  b NA  4
8:  c  8  1
9:  c NA  2