R: 嵌套for循环以比较行并构建新的数据帧



我创建了两个嵌套的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

相关内容

  • 没有找到相关文章

最新更新