【问题标题】:Subtract rows with for loop function in r and print output conditionally用r中的for循环函数减去行并有条件地打印输出
【发布时间】:2019-01-10 19:24:28
【问题描述】:

在矩阵中,我需要按以下方式减去行:row1 减去剩余的每一行;然后 row2 减去剩余的每一行。我需要对矩阵中的每一行执行此操作。

我遇到了三个问题。首先,虽然我能够为 row1 减去剩余的每一行编写一个 for 循环并打印结果,但我不确定如何继续循环以继续移动到 row2 减去剩余的行等到最后一行减去剩余的行,如似乎没有必要为每一行编写循环。

问题二,在执行以下减法时,例如row2 减去剩余的行,我需要在运行循环时跳过从自身减去 row2。当我尝试为 row2 减去剩余行编写 for 循环时,打印的结果总是显示一行,其中 row2 也从自身中减去。我不知道如何避免这种情况。

问题三,减行时,例如row2减row1;第 2 行减去第 3 行;第 2 行减去第 4 行等,我想打印摘要:如果每次减法,每两行之间的差异为零。我将 if 语句包含在下面的代码中并且它完成了这项工作,但我只设法将它用于比较单行与剩余行,所以我想知道如何将它应用于应该与之比较的每个后续行剩余的行。

提前谢谢你

library(dplyr)

# Simulate matrix of integers 
set.seed(1) 
df <- matrix(sample.int(5, size = 3*5, replace = TRUE), nrow = 3, ncol = 5)
print(df)
df <- tbl_df(df)  # tabulate as dataframe 

# For Loop for row 1
for(i in 2:nrow(df)){
result = df[1,] - df[i,]
print(result)
}

# For Loop for row 2
for(i in 1:nrow(df)){
result = df[2,] - df[i,]
print(result)
}

# Trying to print results only for those pairs of rows, between which the 
   difference is zero
for(i in 1:nrow(df)){
result = df[2,] - df[i,]

if (rowSums(result) == 0){
  print("Duplicates present")
 } else {
 print("No duplicates")
        }
 }

【问题讨论】:

    标签: r for-loop if-statement


    【解决方案1】:

    使用 if 子句对行进行两次循环应该会得到预期的结果。不确定您的代码有什么区别,但这段代码应该会给出预期的结果:

        library(dplyr)
    
        # Simulate matrix of integers 
        set.seed(1) 
        df <- matrix(sample.int(5, size = 3*5, replace = TRUE), nrow = 3, ncol = 5)
        print(df)
        df <- tbl_df(df)  # tabulate as dataframe 
    
        # For Loop for row 1
        for(i in 1:nrow(df)){
          for( j in 1:nrow(df)){
            if (i != j) {
              result = df[i,] - df[j,]
              print(paste('row',i,'- row',j,':'))
              print(result)
    
              if (sum(result) == 0){
                print("Duplicates present")
              } else {
                print("No duplicates")
              }
            }
          }
        }
    

    【讨论】:

    • 非常感谢!这就像魔术一样!如果可以的话,请投票,这样其他人也可以看到这篇文章,如果他们认为它相关
    【解决方案2】:

    我不确定这是最有效的方法,但它比你所拥有的更简单。在考虑第 i 行时,您可以用colSums(df[-i,]) 减去剩余的结果。使用它来获取下面的代码。

    set.seed(1) 
    df <- matrix(sample.int(5, size = 3*5, replace = TRUE), nrow = 3, ncol = 5)
    print(df)
    df <- tbl_df(df)  # tabulate as dataframe 
    df
    
    result <- df # result will hold the results
    
    for(i in 1:nrow(df)){
      result[i, ] <- df[i, ] - colSums(df[-i, ]) # result[i, ] is df[i, ] - the sum of all the other rows
    }
    
    result
    
    duplicated(result) # checks for duplicates
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 2018-04-04
      相关资源
      最近更新 更多