【问题标题】:How to extract the certain values from a column indexed by another column?如何从由另一列索引的列中提取某些值?
【发布时间】:2018-07-15 12:11:32
【问题描述】:

我有以下数据,我正在尝试提取cumsum 列的最终值。例如,我想用cumsum0.7810417 从数据框中取出第8 行,然后对1115cumsum0.72826391116 ... 1117 等做同样的事情。

structure(list(WEEK = c(1114L, 1114L, 1114L, 1114L, 1114L, 1114L, 
1114L, 1114L, 1115L, 1115L, 1115L, 1115L, 1115L, 1115L, 1115L, 
1116L, 1116L, 1116L, 1116L, 1116L, 1116L, 1117L, 1117L, 1117L, 
1117L, 1118L, 1118L, 1118L, 1118L, 1118L, 1118L, 1118L, 1119L, 
1119L, 1119L, 1119L, 1119L, 1119L, 1119L, 1119L, 1120L, 1120L, 
1120L, 1120L, 1120L, 1120L, 1120L, 1121L, 1121L, 1121L), price_per_ounce = c(0.124583333333333, 
0.0832638888888889, 0.100972222222222, 0.100972222222222, 0.10375, 
0.0832638888888889, 0.100972222222222, 0.0832638888888889, 0.124583333333333, 
0.0855555555555556, 0.109166666666667, 0.0832638888888889, 0.110972222222222, 
0.10375, 0.110972222222222, 0.124583333333333, 0.0841666666666667, 
0.110972222222222, 0.110972222222222, 0.0832638888888889, 0.110972222222222, 
0.0838888888888889, 0.110972222222222, 0.0832638888888889, 0.110972222222222, 
0.124583333333333, 0.0786111111111111, 0.110972222222222, 0.110972222222222, 
0.10375, 0.110972222222222, 0.0832638888888889, 0.124583333333333, 
0.0925, 0.110972222222222, 0.0832638888888889, 0.110972222222222, 
0.10375, 0.110972222222222, 0.0832638888888889, 0.124583333333333, 
0.0844444444444444, 0.110972222222222, 0.0832638888888889, 0.10375, 
0.110972222222222, 0.0832638888888889, 0.124583333333333, 0.0694444444444444, 
0.110972222222222), Total = c(0.124583333333333, 0.207847222222222, 
0.308819444444444, 0.409791666666667, 0.513541666666667, 0.596805555555556, 
0.697777777777778, 0.781041666666667, 0.124583333333333, 0.210138888888889, 
0.319305555555556, 0.402569444444444, 0.513541666666667, 0.617291666666667, 
0.728263888888889, 0.124583333333333, 0.20875, 0.319722222222222, 
0.430694444444444, 0.513958333333333, 0.624930555555556, 0.0838888888888889, 
0.194861111111111, 0.278125, 0.389097222222222, 0.124583333333333, 
0.203194444444444, 0.314166666666667, 0.425138888888889, 0.528888888888889, 
0.639861111111111, 0.723125, 0.124583333333333, 0.217083333333333, 
0.328055555555556, 0.411319444444444, 0.522291666666667, 0.626041666666667, 
0.737013888888889, 0.820277777777778, 0.124583333333333, 0.209027777777778, 
0.32, 0.403263888888889, 0.507013888888889, 0.617986111111111, 
0.70125, 0.124583333333333, 0.194027777777778, 0.305)), .Names = c("WEEK", 
"price_per_ounce", "Total"), class = c("data.table", "data.frame"
), row.names = c(NA, -50L), .internal.selfref = <pointer: 0x0000000008450788>)

编辑: 当我将数据框设置为 df 时获得的结果

structure(list(df = c(0.781041666666667, 0.728263888888889, 0.624930555555556, 
0.389097222222222, 0.723125, 0.820277777777778, 0.70125, 0.658611111111111, 
0.769583333333333, 0.759027777777778, 0.751666666666667, 0.741597222222222, 
0.519930555555556, 0.712152777777778)), .Names = "df", row.names = c(NA, 
-14L), class = "data.frame")

但是,当我在整个数据帧上运行时,我得到以下信息。

structure(list(df = c(220.124649739256, 199.217289598068, 199.774511556463, 
206.738587849235, 205.766197136359, Inf, Inf, Inf, 205.103350187295, 
199.567357907284, 212.900103648094, 200.477169383407, Inf, 203.441435413023
)), .Names = "df", row.names = c(NA, 14L), class = "data.frame")

我不确定为什么现在出现Infvalues,值也发生了显着变化,但是我所做的只是跳过此命令df &lt;- head(df, 100)

这是我正在应用的代码(当我应用以下所有解决方案时也会发生同样的事情)

Price <- data %>%
  select(WEEK, price_per_ounce)

test <- transform(Price, Total = ave(price_per_ounce, WEEK, FUN = cumsum))

test <- head(test, 100)
#dput(test)

df <- test[, Total[.N], WEEK]$V1
df <- as.data.frame(df)
df <- head(df, 14)
dput(df)

【问题讨论】:

  • 你是不是要为每个'wks'df1[, cumsum[.N],wks]$V1提取'cumsum'列的最后一个值
  • 用你的新数据,df1[, Total[.N], WEEK]$V1# [1] 0.7810417 0.7282639 0.6249306 0.3890972 0.7231250 0.8202778 0.7012500 0.3050000
  • 您更改了列名,现在有什么问题或预期行为?
  • 感谢您的回复,代码有效,但是当我在整个数据帧上运行它时,我仍然遇到inf 问题。我已经编辑了原始问题以显示我得到的输出。
  • 首先,停止改变问题:您已经有四个答案完全符合您的要求。其次,检查您的数据,您可能在df$Total 中有Inf 值(顺便说一句,df 是一个坏名字,因为它是stats 命名空间中的一个函数)

标签: r cumsum


【解决方案1】:

OP 的数据集是data.table。使用data.table 获取每个“WEEK”元素的“TOTAL”最后一行并提取“TOTAL”的方法是

library(data.table)
df1[, Total[.N], WEEK]$V1
#[1] 0.7810417 0.7282639 0.6249306 0.3890972 0.7231250 0.8202778 0.7012500 0.3050000

如果目的不是提取列,那么我们可以对其进行子集化并将其保留为data.table

df1[, .(Total = Total[.N]),  WEEK]

【讨论】:

  • 嗯,data.table 比我想象的更通用,使 R 更接近 Julia/Matlab 索引工具 [+1]
【解决方案2】:
tapply(dat$Total, dat$WEEK, tail, 1)
#     1114      1115      1116      1117      1118      1119      1120      1121 
#0.7810417 0.7282639 0.6249306 0.3890972 0.7231250 0.8202778 0.7012500 0.3050000 

说明

dat$Total 是我们的原子对象,dat$WEEK 是我们的分组变量,tail 是我们要应用的函数,1 是传递给它的第一个参数,所以我们得到每个索引的 dat$Total 的最后一个值在dat$WEEK

【讨论】:

    【解决方案3】:

    基础R

    aggregate(df$cumsum, by = list(df$wks), FUN = tail, n = 1)
    

    【讨论】:

    • 感谢它有效,但我遇到了与上一条评论中提到的相同的问题。
    【解决方案4】:
    library(dplyr)   
    df %>% group_by(wks)%>%
    filter(row_number()==n())
    

    【讨论】:

    • 感谢您的回答,它有效,但是当我将其应用于整个数据大小时,我遇到了 inf 值。我增加了数据大小来显示这一点。这可能是什么原因造成的?
    • 我的猜测是您的完整 data.table 需要一些清理。也许这篇文章会有所帮助? stackoverflow.com/questions/12188509/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2022-11-12
    • 2017-12-05
    • 1970-01-01
    • 2019-02-28
    相关资源
    最近更新 更多