【问题标题】:data.table shift right all cell values by number of na within each row [R]data.table 将所有单元格值右移每行内的 na 数 [R]
【发布时间】:2018-11-29 03:51:18
【问题描述】:

如何将数据表中的单元格向右移动 R 中每行中 NA 的数量?

示例数据:

data <- data.table(c1=c("a","e","h","j"),
                   c2=c("b","f","i",NA),
                   c3=c("c","g",NA,NA),
                   c4=c("d",NA,NA,NA), stringsAsFactors = F)
  c1   c2   c3   c4
1  a    b    c    d
2  e    f    g <NA>
3  h    i <NA> <NA>
4  j <NA> <NA> <NA>

示例中的所需数据:

data.desired <- data.table(
                  c1=c("a",NA,NA,NA),
                   c2=c("b","e",NA,NA),
                   c3=c("c","f","h",NA),
                   c4=c("d","g","i","j"), stringsAsFactors = F)
    c1   c2   c3 c4
1    a    b    c  d
2 <NA>    e    f  g
3 <NA> <NA>    h  i
4 <NA> <NA> <NA>  j

【问题讨论】:

标签: r dataframe data.table shift


【解决方案1】:

这是使用矩阵索引和NA 值的计数器的一次尝试:

#convert back to a data.frame to take advantage of matrix indexing
setDF(data)   

arr <- which(!is.na(data), arr.ind=TRUE)
arr[,"col"] <- arr[,"col"] + rowSums(is.na(data))[arr[,"row"]]
out <- data
out[] <- NA
out[arr] <- data[!is.na(data)]

out
#    c1   c2   c3 c4
#1    a    b    c  d
#2 <NA>    e    f  g
#3 <NA> <NA>    h  i
#4 <NA> <NA> <NA>  j

#convert to data.table if necessary
setDT(out)

这个选项非常快,从一个简短的测试到 4 列 / 200 万行大约需要 3-4 秒。

【讨论】:

    【解决方案2】:

    我们可以使用

    data.table(t(apply(data, 1, function(x){ c(rep(NA, sum(is.na(x))), x[!is.na(x)])})))
    #      V1   V2   V3 V4
    # 1:    a    b    c  d
    # 2: <NA>    e    f  g
    # 3: <NA> <NA>    h  i
    # 4: <NA> <NA> <NA>  j
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 2013-12-06
      • 2014-06-10
      相关资源
      最近更新 更多