目标是在一行中的最后一个值后面用“-”填充 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/