在r中使用for循环函数减去行,并有条件地打印输出

时间:2019-01-10 19:24:28

标签: r for-loop if-statement

在矩阵中,我需要通过以下方式减去行: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")
        }
 }

2 个答案:

答案 0 :(得分:1)

在if子句中两次使用for循环遍历应该可以得到期望的结果。不确定代码中的区别是什么,但是此代码应能达到预期的结果:

    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")
          }
        }
      }
    }

答案 1 :(得分:0)

我不确定这是最有效的方法,但是它比您所拥有的要简单。考虑第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