【问题标题】:Creating a new column with more rows in a data table在数据表中创建具有更多行的新列
【发布时间】:2018-04-19 12:26:30
【问题描述】:

我认为我应该编辑该示例,因为它具有误导性。给您带来的不便深表歉意:(

以下是我遇到的警告示例:

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 创建一个额外的值。

【问题讨论】:

  • @Mike H。我已经编辑了示例,谢谢。
  • @CPak 我已经编辑了示例,也谢谢你。
  • 你怎么知道你想在哪里添加NAs?例如,为什么在第 3 和第 7 行有一个NA?如果你想做dsf$v3 &lt;- c(5,7,4,6,9,4,4,7,9)之类的事情,他们不应该都在最后吗?
  • @Mike H. 在 dsf

标签: r data.table


【解决方案1】:

看起来rowr 包中的cbind.fill 函数可能有用:

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

或者,您可以尝试将两者合并在一起。比如:

dsf2 <- dsf[,rows := 1:nrow(dsf)][data.table(v3=c(1:4), rows = 1:4), on = .(rows)][,rows := NULL]
dsf2
#   v1 v2 v3
#1:  a  3  1
#2:  a  5  2
#3:  b  8  3
#4: NA NA  4

【讨论】:

    【解决方案2】:

    使用此功能

    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
    

    【讨论】:

      【解决方案3】:

      也许,我的回答不好看,但这对我来说已经足够了…… 感谢堆栈溢出:)

      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
      

      【讨论】:

        猜你喜欢
        • 2015-12-21
        • 1970-01-01
        • 2021-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-10
        • 2020-06-08
        • 2021-07-04
        相关资源
        最近更新 更多