R - 计算数据帧并将结果分配给新列

时间:2017-12-12 02:27:22

标签: r

假设我有一些包含日期和价格字段的股票数据。我想添加两个新列来显示边距并确定它是上升还是下降。

原始数据框如下:

        [, 1]    [, 2]
[1,]    Day 1     10
[2,]    Day 2     12
[3,]    Day 3     8

我的期望:

        [,1]   [,2]   [,3]   [,4]
[1,]    Day 1   10     N/A   N/A
[2,]    Day 2   12      2    rise
[3,]    Day 3   8      -4    fall

这是我的代码:

data["margin"] <- c("");
data["result"] <- c("");

dataDiff   <-   diff(data[,2]);

data  <- data[-1, ];

data[,3] <- dataDiff
apply(data, 1, function(x) {
  x[4] <- ifelse(x[3]>0, “rise”, “fall”)
})

View(data)

但是,我的代码存在两个问题。

  1. 由于我自己要删除第一行(无法计算保证金),因此效率似乎相当低。
  2. apply()未按预期工作。结果未分配到data
  3. 的第4列

    任何人都可以提供帮助,非常感谢你。

1 个答案:

答案 0 :(得分:3)

这样的事情(仅限基础R)?

df$Diff <- c(NA, diff(df$Value));
df$Trend <- ifelse(df$Diff < 0, "fall", "rise");
df;
#    Day Value Diff Trend
#1 Day 1    10   NA  <NA>
#2 Day 2    12    2  rise
#3 Day 3     8   -4  fall

cbinddataframe的新列:

df <- cbind.data.frame(
    df,
    c(NA, diff(df[, 2])),
    ifelse(c(NA, diff(df[, 2])) < 0, "fall", "rise"));
colnames(df) <- NULL;

或使用dplyrmagrittr

library(dplyr);
library(magrittr);

df %>% mutate(
    Diff = c(NA, diff(Value)),
    Trend = ifelse(Diff < 0, "fall", "rise"))

样本数据

df <- cbind.data.frame(
    Day = paste("Day", seq(1:3)),
    Value = c(10, 12, 8))