我创建了两个嵌套的for循环来完成以下操作:
遍历不是第一列的每一列:
- 遍历不是最后一行的每一行i(最后一行表示为j)
- 将i中的值与j中的值进行比较。
- 如果i是NA,则i=NA
- 如果i>=j,则i=0
- 如果i<j、 i=1
将所有列和行的所有迭代结果存储在df中。
下面的代码创建了一些测试数据,但生成的值"out"为NULL(空)。有什么建议吗
# Create df
a <- rnorm(5)
b <- c(rnorm(3),NA,rnorm(1))
c <- rnorm(5)
df <- data.frame(a,b,c)
rows <- nrow(df) # rows
cols <- ncol(df) # cols
out <- for (c in 2:cols){
for (r in 1:(rows - 1)){
ifelse(
is.na(df[r,c]),
NA,
df[r, c] <- df[r, c] < df[rows, c])
}
}
根本不需要循环。使用像sweep
这样的矢量化函数,通过>
比较最后一行df[nrow(df),]
与所有其他行df[-nrow(df),]
:
df
# a b c
#1 -0.2739735 0.5095727 0.30664838
#2 0.7613023 -0.1509454 -0.08818313
#3 -0.4781940 1.5760307 0.46769601
#4 1.1754130 NA 0.33394212
#5 0.5448537 1.0493805 -0.10528847
sweep(df[-nrow(df),], 2, unlist(df[nrow(df),]), FUN=`>`)
# a b c
#1 FALSE FALSE TRUE
#2 TRUE FALSE TRUE
#3 FALSE TRUE TRUE
#4 TRUE NA TRUE
sweep(df[-nrow(df),], 2, unlist(df[nrow(df),]), FUN=`>`) + 0
# a b c
#1 0 0 1
#2 1 0 1
#3 0 1 1
#4 1 NA 1
这里是另一个选项。我们可以复制最后一行,使两个数据集的维度相等,然后执行>
以获得逻辑索引,可以通过用+
包装将其强制为二进制索引。
+(df[-nrow(df),] > df[nrow(df),][col(df[-nrow(df),])])
# a b c
#1 0 0 1
#2 1 0 1
#3 0 1 1
#4 1 NA 1