r-条件语句:每行选择/分配一个变量



我有一个数据集,每个数据集有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

shiftdata.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))]

最新更新