滚动比较以创建新的列

时间:2020-09-20 01:41:53

标签: r

我是R的新手,正在研究如何做我可以在R的excel中做的事情。我在尝试确定如何创建一个新列时遇到麻烦,该列表示何时一列中的上一个值在第二列中的值下方穿过。非常简单的时间序列分析。

val1   val2   
3      2
3      2
1      2 <- Cross under
1      2
1      2
3      2

我想像这样将oput附加为数据框上的一列:

val1   val2   Xunder   
3      2      na
3      2      na
1      2      true
1      2      na
1      2      na
3      2      na

我要使用的代码是:

for(i in 1:length(workingFile)){
    if(workingFile$val1[i] < workingFile$val2[i] &&
       workingFile$val1[i-1] > workingFile$val2[i-1]){
           XUnder<-append(XUnder,TRUE)} 
    else{
           XUnder<-append(XUnder,NA)
        }
}

workingFile是几千行,当我运行此代码时,XUnder在向量中只有10个左右的项目,因此我不想将其作为一列添加到原始文件中。不知道这里发生了什么,或者我是否以一种低效的方式来解决这个问题。感谢您的所有帮助!

2 个答案:

答案 0 :(得分:3)

在R中,很少需要显式的for循环来执行操作。 R中的许多函数都是矢量化的,这意味着它们可以处理多个值,您不需要一一传递它们。如果未对函数进行矢量化,则可以使用apply函数家族(或其他函数)来完成与for循环相同的工作。

您可以在此处直接使用比较val1val2,并使用lag比较先前的值。

library(dplyr)
workingFile <- workingFile %>% 
                   mutate(Xunder = val1 < val2 & lag(val1) > lag(val2))
workingFile
#  val1 val2 XUnder
#1    3    2  FALSE
#2    3    2  FALSE
#3    1    2   TRUE
#4    1    2  FALSE
#5    1    2  FALSE
#6    3    2  FALSE

如果您需要NA而不是FALSE,请执行以下操作:

workingFile$Xunder[!workingFile$Xunder] <- NA

答案 1 :(得分:0)

如果您想使用基本的R方法,请参见以下示例:

# Creates Data
df <- data.frame(Val1 = c(3,3,1,1,1,3,3), Val2 = 2)

# Finds the first row where the value in the second column 
# is less than the value in the first column
index <- which(df$Val1 < df$Val2, arr.ind = TRUE)[1]

# Make NA's up until the row, puts true, then fills
# the rest of the rows with NA's
col <- c(rep(NA, index-1), TRUE, rep(NA, nrow(df)-index))

# If you want to add the vector to your dataset
df$Xunder <- col
df
#>   Val1 Val2 Xunder
#> 1    3    2     NA
#> 2    3    2     NA
#> 3    1    2   TRUE
#> 4    1    2     NA
#> 5    1    2     NA
#> 6    3    2     NA
#> 7    3    2     NA

reprex package(v0.3.0)于2020-09-19创建

此代码的作用是找到满足条件的第一行,然后创建一个具有NA值的向量,直到该点,然后放入TRUE,然后继续用{{1 }}值。最后,它将向量添加为数据框中的一列。

如果您不想将其添加到数据框中,那就不要运行最后一行代码