【问题标题】:Find closest value from column and return number from adjacent column (within lists)从列中查找最接近的值并从相邻列返回数字(在列表中)
【发布时间】:2016-11-22 11:06:39
【问题描述】:

我有一个包含 x 个数据框的大列表 (List1),每个数据框由(假设)2 个变量的 4 个观察值组成。典型的数据框如下所示:

YEAR   TEMP
1861    2.09
1862    2.17
1863    2.02
1864    2.04
............

我希望在第二列中找到最接近值 2 的值(但理想情况下不大于 2.05 且不小于 1.95),然后从左侧相邻列返回年份。这在 Excel 中使用 VLOOKUP 和 INDEX 等函数很简单,但是在 R 中是否有任何等效函数?忽略它需要 >=1.95 和

result=lapply(List1, function(x) which.min(abs(x-2)))

但这会返回错误:

Error in which.min(abs(x - 2)) : 
(list) object cannot be coerced to type 'double'

我不认为我在这里很远,但是谁能建议我在哪里可以纠正这个问题?

【问题讨论】:

  • lapply(List1, function(i) i$YEAR[i$TEMP >=1.95 & i$TEMP <= 2.05]) 怎么样?
  • 你需要考虑 x 是一个data.frame

标签: r


【解决方案1】:

您的函数是apply 到您列表中的每个元素,即data.frames

因此,为了使您的陈述有效,您需要使用要在其上进行测试的x 列:

result <- lapply(List1, function(x) x[which.min(abs(x$TEMP-2)), ])

result <- lapply(List1, function(x) x$YEAR[which.min(abs(x$TEMP-2))])

如果你只想要年份。

如果要添加其他条件,请尝试:

result <- lapply(List1, function(x) {x <- x[x$TEMP <= 2.05 & x$TEMP >= 1.95, ] ; return(x$YEAR[which.min(abs(x$TEMP-2))])})

【讨论】:

  • 感谢这些建议。第一个解决方案很好地解决了问题的第一部分,但是添加额外条件的解决方案由于意外的 } 和 ; 而不起作用
  • @DJ-AFC 确实我忘记了右括号,它现在应该可以工作了,如果不是这样,请告诉我
猜你喜欢
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多