r - data.table 将所有单元格值右移每行内的 na 数 [R]
问题描述
如何将数据表中的单元格向右移动 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
解决方案
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 秒。
推荐阅读
- kubernetes - 如何将spring cloud任务java jar注册到spring数据流kubernetes中
- microsoft-graph-api - 有没有办法使用 Outlook Rest API 列出用户的共享邮箱?
- javascript - 如何使用 jQuery 调用 vbscript 函数?
- regex - 将提取的文本字符串转换为 Postgres 中字符串长度不同的日期
- android - Using Firebase in a multi-module project
- xslt-1.0 - How to remove Namespaces when copying nodes to a different node in XML through XSLT1.0?
- javascript - 有什么方法可以与 graphql 查询字段相反?
- python - About custom operations in Tensorflow and PyTorch
- javascript - Having pagination issue in Vue / Laravel
- php - Laravel AdminLTE - How to call method and use its data in view