r - 如何 lappy !is.na() 为 R data.table 赋值

标签 r data.table lapply na

目标是在一行中的最后一个值后面用“-”填充 NA

# Like this
   SOURCE  X__2  X__3 X__4 X__5 X__6 X__7  X__8  X__9 INFO
1: 04.xlsx David David    -    -    -    -     -     -    A
2: 05.xlsx  <NA>  <NA>  Tom  Tom    -    -     -     -    B
3: 06.xlsx  <NA>  <NA> <NA> <NA> Mary Mary     -     -    C
4: 07.xlsx  <NA>  <NA> <NA> <NA> <NA> <NA> Peter Peter    D

# Sample data
dt <- data.table(SOURCE = c("04.xlsx","05.xlsx","06.xlsx","07.xlsx"),
                   X__2 = c("David",NA,NA,NA),
                   X__3 = c("David",NA,NA,NA),
                   X__4 = c(NA,"Tom",NA,NA),
                   X__5 = c(NA,"Tom",NA,NA),
                   X__6 = c(NA,NA,"Mary",NA),
                   X__7 = c(NA,NA,"Mary",NA),
                   X__8 = c(NA,NA,NA,"Peter"),
                   X__9 = c(NA,NA,NA,"Peter"),
                   INFO = LETTERS[1:4])

我尝试过但没有成功

# Find odd columns 
TAR_COL <- grep("X__",colnames(dt))[!c(TRUE,FALSE)]

dt[!is.na(TAR_COL),(TAR_COL):="-",.SDcols =TAR_COL]

该脚本在指定 col 时有效,但失去动态选择列的能力

#
dt[!is.na(X__3),(grep("X__3",names(dt))+1):(grep("INFO",names(dt))-1) := "-"][]

  SOURCE  X__2  X__3 X__4 X__5 X__6 X__7  X__8  X__9 INFO
1: 04.xlsx David David    -    -    -    -     -     -    A

由于真实数据集是从不同的xlsx数据导入的,动态选择奇数是必须的

是否有任何方法可以在矢量化列索引中应用!is.na()并赋值?

最佳答案

我们可以使用set。使用 set 循环遍历“TAR_COL”的列索引,指定列索引 (j) 和行索引 (i - 其中 NA位于该特定列中),并将设置为“-”

for(j in TAR_COL) set(dt, i = which(is.na(dt[[j]])), j= j, value = "-")
dt
#   SOURCE  X__2  X__3 X__4 X__5 X__6 X__7  X__8  X__9 INFO
#1: 04.xlsx David David <NA>    - <NA>    -  <NA>     -    A
#2: 05.xlsx  <NA>     -  Tom  Tom <NA>    -  <NA>     -    B
#3: 06.xlsx  <NA>     - <NA>    - Mary Mary  <NA>     -    C
#4: 07.xlsx  <NA>     - <NA>    - <NA>    - Peter Peter    D

此处,第 3、5、7、9 列的 NA 元素替换为 -


注意:!is.na(TAR_COL) 没有帮助,因为“TAR_COL”只是一个列索引

更新

根据OP的澄清,即替换NA必须从最后出现的值到“INFO”之前的最后一列水平进行,我们可以按照@markus在评论中建议的那样创建一个具有累积总和的索引

# get the column names that start with 'X__'
nms <- names(dt)[startsWith(names(dt), "X__")]
# change the i index with cumulative sum
for(j in nms) set(dt, i = which(cumsum(!is.na(dt[[j]])) == 0), j = j, value = "-") 

关于r - 如何 lappy !is.na() 为 R data.table 赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55632890/

相关文章:

r - 如果未提供变量,为什么用 data.table 插槽初始化 R S4 类不起作用

r - 对于每一列,按组在之前的时间窗口内对分数进行求和

r - 多个矩阵的加权平均值 - 逐个元素

r - R中并行计算的stdout和stderr

c++ - 更改 Mac OS X 10.9.1 w/Xcode 5 上 R Shiny 使用的 C++ 标准库(__cxa_guard_acquire 检测到死锁)

r - 使用 lapply() 时如何打印所有列并防止插入一列?

r - 使用 lapply 后将列名指定为行名

R错误: could not find function is_empty

r - 使用 data.table,是否可以通过重复组中的第一个 X 值来创建新列

r - 映射列表并将变量插入到函数中