【问题标题】:Comparing columns per row in a dataframe R比较数据框R中每行的列
【发布时间】:2019-03-07 14:27:56
【问题描述】:

我有一个包含 3 列和几千行的数据框。现在我想比较每行列中的值,看看这些值是否遵循特定趋势。

Df <- data.frame(Value1 = c(13,19,56,47,15,13,64, 48), Value2 = c(54,64,11,21,15,48,12,78), Value3 = c(66,78,05,12,21,23,45,30))

在此示例中,数据框的第 1 行将是一个向上的斜坡,而第 3 行将是一个向下的斜坡。

我写了这个 for 循环来遍历整个数据框。

for(row in 1:nrow(Df)) {
  if (Df$Value1 > Df$Value2 & Df$Value2 > Df$Value3){
    print("Downward slope")
  } else if (Df$Value1 < Df$Value2 & Df$Value2 < Df$Value3){
    print("Upward slope")
  } else if (Df$Value1 > Df$Value2 & Df$Value2 < Df$Value3){
    print("Dip")
  } else if (Df$Value1 < Df$Value2 & Df$Value2 > Df$Value3){
    print("Peak")
  }
}

现在这可能已经非常低效了,但它甚至不起作用。运行时出现错误:

条件长度 > 1 且仅使用第一个元素条件长度 > 1 且仅使用第一个元素[1]“上坡”

条件的长度 > 1 且仅使用第一个元素 条件的长度 > 1 且仅使用第一个元素[1]“上坡”

我怎样才能让这样的事情发挥作用?

【问题讨论】:

  • 您没有在for 循环内的任何地方使用row。例如,首先将if 更改为if (Df$Value1[row] &gt; Df$Value2[row] &amp; Df$Value2[row] &gt; Df$Value3[row]),其他if 语句类似。

标签: r dataframe for-loop if-statement


【解决方案1】:

最好使用矢量化ifelse 而不是循环

ifelse(Df[,1] >  Df[,2],
  ifelse(Df[,2] >  Df[,3], 'down', 'dip'),
  ifelse(Df[,2] >  Df[,3], 'peak', 'up'))
#[1] "up"   "up"   "down" "down" "up"   "peak" "dip"  "peak"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多