【问题标题】:running if and else within a for loop across columns在跨列的 for 循环中运行 if 和 else
【发布时间】:2021-04-18 02:03:32
【问题描述】:

我试图让 R 逐列读取并评估来自两个相邻单元格的值是否相等。如果值相等,我希望 R 将这种情况计算在一个新变量中。这是示例数据(df):

Var1 Var2 Var3
2 3 3
3 3 3
1 2 3
3 2 1

...我想去这里:

Var1 Var2 Var3 NewVar
2 3 3 1
3 3 3 2
1 2 3 0
3 2 1 0

我尝试过的一组示例代码如下:

df$NewVar <- 0

for (i in 1:2){
  if (df[i]==df[i+1]){
    df$NewVar <- df$NewVar + 1
  }
  else{
    df$NewVar <- df$NewVar
  }
}

这组特定的代码只是在 NewVar 变量中返回 0。

任何形式的帮助将不胜感激!

【问题讨论】:

  • 你们俩都应该知道 df[1] 和 df[,1] 是一样的。
  • @DavidB。 if 函数无法处理列。而且您的代码不会应用基于行的测试和计算。看看 ifelse()。

标签: r for-loop if-statement apply


【解决方案1】:

这是使用rowSums 的矢量化解决方案:

df$NewVar <- rowSums(df[-1] == df[-ncol(df)])
df

#  Var1 Var2 Var3 NewVar
#1    2    3    3      1
#2    3    3    3      2
#3    1    2    3      0
#4    3    2    1      0

数据

df <- structure(list(Var1 = c(2L, 3L, 1L, 3L), Var2 = c(3L, 3L, 2L, 
2L), Var3 = c(3L, 3L, 3L, 1L)), class = "data.frame", row.names = c(NA,-4L))

【讨论】:

    【解决方案2】:

    我们可以使用Reduce

    df$NewVar <- Reduce(`+`, Map(`==`, df[-1], df[-ncol(df)]))
    

    数据

    df <- structure(list(Var1 = c(2L, 3L, 1L, 3L), Var2 = c(3L, 3L, 2L, 
    2L), Var3 = c(3L, 3L, 3L, 1L)), class = "data.frame", row.names = c(NA,-4L))
    

    【讨论】:

      猜你喜欢
      • 2018-09-09
      • 2017-08-02
      • 2019-12-04
      • 2022-01-10
      • 2012-11-13
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2021-09-16
      相关资源
      最近更新 更多