我有一个数据集,每个数据集有2个VP和350个间隔值。我正在编写一个if循环,以选择VP1的最小值与VP2的最大值何时重叠。
数据通常按VP排序,但我安排按最小值排序,因为这是一个时间框架。
我运行了以下代码,当值与前一项重叠时,它可以分配0或1,但它不考虑前一项是什么(即前一项是否为VP1或VP2(。
for (i in 2:length(df$newvariable)) {
if (df$minimum[i] < df$maximum[i-1]){
df$newvariable[i] <- 0
} else {
df$newvariable[i] <- 1
}
}
我想说if df$minimum[i] of VP1 < df$maximum[i] of VP2, then df$newvariable = 0. Otherwise, df$newvariable = 1.
我一直找不到如何使它对每一行都有条件,并再次循环。有人有什么建议吗?
非常感谢。
样本数据:
VP xmin xmax
1 0 6
2 0 2
2 6 14
1 14 24
2 20 30
1 30 36
对于大约600行,以此类推。
期望输出:
VP xmin xmax newvariable
1 0 6 -
2 0 2 0
2 6 14 1
1 14 24 1
2 20 30 0
1 30 36 1
如果我有一个有另一个变量的数据帧,并且我只查看变量的一部分。例如,变量=talking,赋值为1(是(或0(否(。我最初只关注0并创建新的变量,比如quiet_together。然而,我想把这些数据帧放回一起,但在单独的数据帧中添加了列。如果我想要与上面描述的完全相同的东西,但将数据帧放在一起(而不是两个单独的数据帧(,我将如何为每个分配的变量指定?最后,我想得到两个基于xmin和xmax值的新列,同时考虑谈话变量中的值。当前一行的xmin<=xmax时,新的列将是talk_together(用于talking变量的1值(和quiet_togeher(用于talk变量的0值(。
例如:
样本数据:
VP xmin xmax talking
1 0 6 0
2 0 2 0
2 2 6 1
2 6 14 0
1 6 14 1
2 14 24 1
1 14 20 0
1 20 30 1
2 24 32 0
1 30 32 0
对于大约600行,以此类推。
期望输出:
VP xmin xmax talking talk_together quiet_together
1 0 6 0 0 0
2 0 2 0 0 0
2 2 6 1 0 0
2 6 14 0 0 0
1 6 14 1 0 0
1 14 20 0 0 0
2 14 24 1 1 0
1 20 30 1 1 0
2 24 32 0 0 1
1 30 32 0 0 1
您可以使用dplyr
中的lag
与以前的xmax
值进行比较。
library(dplyr)
df %>% mutate(newvariable = as.integer(xmin >= lag(xmax)))
# VP xmin xmax newvariable
#1 1 0 6 NA
#2 2 0 2 0
#3 2 6 14 1
#4 1 14 24 1
#5 2 20 30 0
#6 1 30 36 1
或shift
与data.table
library(data.table)
setDT(df)[, newvariable := +(xmin >= shift(xmax))]
基本R替代品有:
df$newvariable <- as.integer(c(NA, df$xmin[-1] >= df$xmax[-nrow(df)]))
和
df$newvariable <- +c(NA, tail(df$xmin, -1) >= head(df$xmax, -1))
使用data.table
,我们可以进行
library(data.table)
setDT(df)[, newvariable := as.integer(xmin >= shift(xmax))]