在R中的数据帧中组合两种不同的数据类型

时间:2014-02-21 00:36:59

标签: r dataframe

我意识到在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

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

2)或者您可以直接使用row.names 来获取该字符串标签,这样您就可以直接访问SD行作为df ['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放在“日期”字段中,以便聚合不会获取它。这种方法可能更清洁,避免了选项2)的陷阱。另一个主要优点是将“日期”列保留为日期类型(优点:能够直接应用任何日期函数;自动绘图标签和排序)。

让我们退一步的语法,你是否可以将其融入数据框,并考虑你想要实现的目标 - 这个'SD'条目的目的究竟是什么:标签,行索引,行或者专栏帮助找到SD ......?

4)如果您只想显示带有SD行的表(并且实际上没有在数据帧中插入SD行),您可以使用 aggregate / ddply / summarize来实现和/或

ddply(df,。(Date),summary,SD = sd(AAPL))

所以:这完全取决于你究竟想要做什么。告诉我们更多!