【问题标题】:Combine Two Different Data Types in a Data Frame in R在 R 中的数据框中组合两种不同的数据类型
【发布时间】:2016-03-15 04:51:32
【问题描述】:

我意识到在 R 中可能没有办法做到这一点,因为我的理解是向量中的所有值都需要具有相同的数据类型。

我有一个包含两列的数据框,第一列是日期,第二列是给定股票在该日期的收盘价。我想在底部添加一行,第一列“SD”中的标签和价格变化的标准差值。

我可以很好地计算标准差,但是,当我尝试在底部的第一列中添加“SD”标签时,R 并不满意。第一列的格式为.Date,如果可能的话,我想保持这种格式。如果没有,我至少希望它看起来像一个日期,以便我可以轻松读取数据。

有没有办法做到这一点?

这是一些示例数据:

Date          AAPL    
1  2014-01-21 549.07
2  2014-01-22 551.51
3  2014-01-23 556.18
4  2014-01-24 546.07
5  2014-01-27 550.50
6  2014-01-28 506.50
7  2014-01-29 500.75
8  2014-01-30 499.78
9  2014-01-31 500.60
10 2014-02-03 501.53
11 2014-02-04 508.79
12 2014-02-05 512.59
13 2014-02-06 512.51
14 2014-02-07 519.68
15 2014-02-10 528.99
16 2014-02-11 535.96
17 2014-02-12 535.92
18 2014-02-13 544.43
19 2014-02-14 543.99
20 2014-02-18 545.99
21 2014-02-19 537.37

我希望它看起来像这样,SD 信息在最后一行:

Date          AAPL    
1  2014-01-21 549.07
2  2014-01-22 551.51
3  2014-01-23 556.18
4  2014-01-24 546.07
5  2014-01-27 550.50
6  2014-01-28 506.50
7  2014-01-29 500.75
8  2014-01-30 499.78
9  2014-01-31 500.60
10 2014-02-03 501.53
11 2014-02-04 508.79
12 2014-02-05 512.59
13 2014-02-06 512.51
14 2014-02-07 519.68
15 2014-02-10 528.99
16 2014-02-11 535.96
17 2014-02-12 535.92
18 2014-02-13 544.43
19 2014-02-14 543.99
20 2014-02-18 545.99
21 2014-02-19 537.37
22 SD         0.0217

谢谢。

【问题讨论】:

  • 这一切都取决于你到底想要做什么。跟我们多说些!为什么 必须 SD 是 Date 列中的字符串?有许多创造性的选择。
  • 如果您觉得我的回答有用(或任何其他),请点击“接受”。

标签: r dataframe


【解决方案1】:

是的,您不能在一列中混合不同的类型(日期和字符串),也不能将“SD”混入日期类型。但是,这里有一些可能性:

1) 也将日期表示为字符串,这也允许“SD”;这实际上可以很好地与您的特定日期格式 yyyy-mm-dd 配合使用,因为排序顺序是正确的。请注意,除非您明确排除 SD 行(按行索引,或测试 as.Date(...) 转换是否有效),否则这会弄乱 ddply/聚合日期。

2) 或者您可以直接使用 row.names 获取该字符串标签,这样您就可以直接以 df['SD',] 的形式访问 SD 行:

# Lose any existing row.names
row.names(df) = NULL
# Now directly append your SD row when you compute it:
df['SD',] = c('NA', sd(df$AAPL, na.rm=TRUE))
# Or else (less elegant) kludge the row.name onto existing SD row.
row.names(df)[21] = 'SD'
 [1] "1"  "2"  "3"  "4"  "5" "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15" "16" "17"
[18] "18" "19" "20" "SD"

像这样劫持 row.names 可能是错误的形式和限制,因为任何索引或转换操作、转换为矩阵/数组等 / 都会删除“SD”。这是你的电话。显然,我们在整个数据框中只能有一个“SD”行,所以我们不能做多个月。

3) 或者您可以插入一个新的字符串列,除了 'SD' 行之外的所有内容都将是 ''。这样,您可以相当优雅地将 SD 行引用为 df[df$SD=='SD', ...] 行,而不会污染日期字段。将 NA 放在 Date 字段中,这样它就不会被聚合拾取。这种方法可能更干净,避免了选项 2) 的陷阱。另一个主要优点是将“日期”列保留为日期类型(优点:能够直接对其应用任何日期函数;自动绘图标签和排序)。

让我们从您是否可以将其合并到数据框中的语法退后一步,并考虑您想要实现的目标 - 这个“SD”条目的确切目的是什么:标签、行索引、行或帮助定位 SD 的列...?

4) 如果您只想显示带有 SD 行的表格(而不是实际在数据框中插入 SD 行),您可以使用 aggregate/ddply/summarize 来实现 和/或 表格

ddply(df, .(Date), summarise, SD=sd(AAPL))

所以:这完全取决于您到底想做什么。告诉我们更多!

【讨论】:

  • 感谢您的所有 cmets。最终目标是获得一个 csv 文件,我可以在 excel 中打开该文件,其中有一列代码和一列 20 天 SD。这可以在没有我问的所有问题的情况下完成,并且可能是我应该做的。我想组合 SD 和日期的原因是出于数据验证的目的,以确保任何股票都没有丢失数据点。同样,这可以在不将 SD 添加到数据帧的情况下关闭。
  • 选项 4) 然后(或者 1),如果您不介意将“日期”列转换为字符串)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2014-11-28
  • 1970-01-01
  • 2016-10-30
  • 2020-08-31
相关资源
最近更新 更多