假设我有一些包含日期和价格字段的股票数据。我想添加两个新列来显示边距并确定它是上升还是下降。
原始数据框如下:
[, 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)
但是,我的代码存在两个问题。
data
任何人都可以提供帮助,非常感谢你。
答案 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
或cbind
旧dataframe
的新列:
df <- cbind.data.frame(
df,
c(NA, diff(df[, 2])),
ifelse(c(NA, diff(df[, 2])) < 0, "fall", "rise"));
colnames(df) <- NULL;
或使用dplyr
和magrittr
:
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))