我有一个数据框
Name M0 M1 M2 M3 M4 M5
ABC 4 4 3 4 33 22
XYZ 3 5 6 22 1 33
RTF 3 7 33 2 4 0
hdj 32 3 9 3 1 3
.
.
Tim 4 4 0 3 3 1
我想基于以下patern添加NA或Null值。第二行保留所有列值。但是第3行的最后一个列值为NULL或NA。第4行最后两列值
Name M0 M1 M2 M3 M4 M5
ABC 4 4 3 4 33 22
XYZ 3 5 6 22 1 NA
RTF 3 7 33 2 NA NA
hdj 32 3 9 NA NA NA
.
.
tim 3 NA NA NA NA NA
这是我的尝试
# getting the maximum rows and cols
rows<-nrow(df)
cols<-ncol(df)
for (i in 3:rows) {
df[i,cols:cols-i-1]<-NULL
}
道歉这是多么基本。但只是其中一天!了解实现这一目标的多种方式将会很有用。个人粉丝dplyr包。
答案 0 :(得分:1)
一种选择是创建一个{1}的1,其尺寸与&#39; df1&#39;中的数字列相同,将其中的下三角形元素更改为matrix
,循环按行,反转elemens(NA
),与数字列相乘并分配输出。当任何数字乘以NA返回NA时,这将是有用的。
rev
或者我们可以使用 m1 <- matrix(1, nrow=nrow(df1), ncol=ncol(df1)-1)
m1[lower.tri(m1)] <- NA
df1[-1] <- df1[-1]*apply(m1, 1, rev)
df1
# Name M0 M1 M2 M3 M4 M5
#1 ABC 4 4 3 4 33 22
#2 XYZ 3 5 6 22 1 NA
#3 RTF 3 7 33 2 NA NA
#4 hdj 32 3 9 NA NA NA
#5 zdf 42 1 NA NA NA NA
#6 Tim 4 NA NA NA NA NA
中的shift
函数。我们使用data.table
选项在1s的向量上填充type='lead'
元素,NA
rbind
元素,并在前面的解决方案中进行乘法运算。
list
library(data.table)
df1[-1] <- df1[-1]*do.call(rbind,shift(rep(1, ncol(df1)-1),
seq(ncol(df1)-1)-1, type='lead'))
答案 1 :(得分:0)
我不确定我是否理解,但我认为你期望这样的事情(因为df
采用你的数据框):
df <- matrix(1, ncol=6, nrow=7)
ncol(df) -> ile_kolumn
ile_kolumn:3 -> ktore
if(nrow(df)-1-length(ktore)>0){
ktore <- c(ktore, rep(ktore[length(ktore)], nrow(df)-1-length(ktore)))
}
for(i in 2:nrow(df)){
df[i, ile_kolumn:ktore[i-1]] <- NA
}