【发布时间】:2020-03-28 20:08:41
【问题描述】:
我想在 R 中创建一个函数来比较“当前行值”和“前一行值”。 一个。如果当前行值低于前一行值,则返回字 LOW 湾。如果当前行值高于上一个值,则返回单词 HIGH C。如果当前行值与前一行值相同,则返回单词 EQUAL
我想创建一个名为 Decision 的新 COLUMN,其中的单词将如下所示进行存储
价值决策
1 不适用
2 高
1.5 低
1.4 低
1.4 等于
【问题讨论】:
标签: r
我想在 R 中创建一个函数来比较“当前行值”和“前一行值”。 一个。如果当前行值低于前一行值,则返回字 LOW 湾。如果当前行值高于上一个值,则返回单词 HIGH C。如果当前行值与前一行值相同,则返回单词 EQUAL
我想创建一个名为 Decision 的新 COLUMN,其中的单词将如下所示进行存储
价值决策
1 不适用
2 高
1.5 低
1.4 低
1.4 等于
【问题讨论】:
标签: r
我们可以使用case_when 将'Value' 与之前的'Value' (lag) 进行比较,并根据它是更低还是更高来创建'Decision' 列
library(dplyr)
df1 %>%
mutate(Decision = case_when(Value < lag(Value) ~ "LOW",
Value > lag(Value) ~ "HIGH", Value == lag(Value) ~ "EQUAL"))
# Value Decision
#1 1.0 <NA>
#2 2.0 HIGH
#3 1.5 LOW
#4 1.4 LOW
#5 1.4 EQUAL
或者另一种选择是获取差异然后更改factor中的labels
with(df1, c(NA_character_,
as.character(factor(sign(Value[-length(Value)] - Value[-1]),
levels = c(-1, 1, 0), labels = c("HIGH", "LOW", "EQUAL")))))
#[1] NA "HIGH" "LOW" "LOW" "EQUAL"
或者使用for 循环
df1$Decision <- rep(NA_character_, nrow(df1))
for(i in 2: nrow(df1)){
if(df1$Value[i] > df1$Value[i-1]){
df1$Decision[i] <- "HIGH"
} else if(df1$Value[i] < df1$Value[i-1]) {
df1$Decision[i] <- "LOW"
} else df1$Decision[i] <- "EQUAL"
}
如果需要是函数
f1 <- function(dat, colNm, newCol) {
dat[[newCol]] <- rep(NA_character_, nrow(dat))
for(i in 2: nrow(dat)){
if(dat[[colNm]][i] > dat[[colNm]][i-1]){
dat[[newCol]][i] <- "HIGH"
} else if(dat[[colNm]][i] < dat[[colNm]][i-1]) {
dat[[newCol]][i] <- "LOW"
} else dat[[newCol]][i] <- "EQUAL"
}
dat
}
f1(df1, "Value", "Decision")
df1 <- structure(list(Value = c(1, 2, 1.5, 1.4, 1.4)), class = "data.frame",
row.names = c(NA,
-5L))
【讨论】: