【问题标题】:Selecting row by min value and merging按最小值选择行并合并
【发布时间】:2020-08-06 20:13:19
【问题描述】:

这是 R 中的行选择问题。

我想根据变量 15 的最小值在每个数据集中只获取一行。我在下面尝试了两种方法,它们都没有返回所需的输出。

对于列表 1> SPX[[1]],date.frame 的设置如下:

SPX1[[1]]
+----------------------------------+---------+------------------------+----------------+
|                                  | stkPx   |          expirDate     |    fifteen     |
+----------------------------------+---------+------------------------+----------------+
| 1                                | 1461.62 | 2013-01-19             |          2     |
| 2                                | 1461.25 | 2013-01-25             |          8     |
| 3                                | 1461.35 | 2013-02-01             |          3     |
| .                                |  .      |  .                     |          .     |
| .                                |  .      |  .                     |          .     |
+----------------------------------+---------+------------------------+----------------+

第一种方法是聚合和合并。由于必须对列表执行此操作,因此代码处于循环中:

df.agg<- list() # creates a list
for (l in 1:length(SPX1)){ 
  df.agg[[l]]<- SPX1[[l]] %>%
aggregate(fifteen ~ ticker, data=SPX1[[l]], min) #Finding minimum value of fifteen for ticker
df.minSPX1 <- merge(df.agg[[l]], SPX1[[l]]) #Merge dataset so we only get row with min fifteen value
}

我明白了:

Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'SPX1' of mode 'function' was not found

另一种方法,但是它只是将第一列的所有值更改为一个,而不是在合并时删除任何行:

TESTER<- which.min(SPX1[[1]]$fifteen) # Finds which row has minimum value of fifteen
df.minSPX1 <- merge(TESTER, SPX1[[1]],by.x=by) #Try to merge so I only get the row with min. fifteen

我已尝试阅读有关 SO 的其他答案,但可能由于列表的设置方式,这不起作用?

我希望你能告诉我我哪里弄错了。

【问题讨论】:

  • 您能澄清一下这里的最小值的含义吗?可能很小,例如
  • 十五是两个日期的差值。它始终是一个正整数。因此,我希望找到“十五”最接近 0 的行。

标签: r merge aggregate


【解决方案1】:

试试这个

df<- lapply(SPX, function(x) x[x$fifteen==min(x$fifteen),])    
df<- as.data.frame(df)

编辑: 正如@Gregor-Thomas 所建议的,这将在出现平局时起作用。

df<- lapply(SPX, function(x) x[which.min(x$fifteen), ])
df<- as.data.frame(df)

【讨论】:

  • 这很接近,但除非您将变量 fifteen 指定为列,否则将无法找到它。我建议function(x) x[which.min(x$fifteen), ]。即使有平局,使用which.min 也可以保证单行结果,我认为 OP 想要,因为他们说“我只想得到一行”。
  • 我错过了。现已更正
  • 第一部分有效。但是,将列表转换为数据框时,数据是水平添加的,因此我有一个观察值和 3900 个变量。
  • 就我而言,数据框应由df2 &lt;- ldply (df, data.frame) 排列。 ldply 是 plyr 包的一部分。
  • @Anders 要更改列表,请使用dplyr::bind_rows(list)do.call(rbind, list)data.table::rbindlist(list) 进行数据框。 plyr 有点过时了,如果你使用更现代的dplyr 会引起冲突。
猜你喜欢
  • 2014-02-22
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
相关资源
最近更新 更多