我是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个左右的项目,因此我不想将其作为一列添加到原始文件中。不知道这里发生了什么,或者我是否以一种低效的方式来解决这个问题。感谢您的所有帮助!
答案 0 :(得分:3)
在R中,很少需要显式的for
循环来执行操作。 R中的许多函数都是矢量化的,这意味着它们可以处理多个值,您不需要一一传递它们。如果未对函数进行矢量化,则可以使用apply
函数家族(或其他函数)来完成与for
循环相同的工作。
您可以在此处直接使用比较val1
和val2
,并使用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 }}值。最后,它将向量添加为数据框中的一列。
如果您不想将其添加到数据框中,那就不要运行最后一行代码