R 所有选定变量的滞后是否等于其当前值

R 所有选定变量的滞后是否等于其当前值,r,R,我有一个这样的数据集 data.frame(id = c(1,2,3,4), var1 = c(1,1,2,2), var2 = c(1,1,2,3)) 我正试图做到这一点: data.frame(id = c(1,2,3,4), var1 = c(1,1,2,2), var2 = c(1,1,2,3), same = c(NA, TRUE, FALSE, FALSE)) i、 e.仅当每个变量的差值等于0时,结果才为真。 如果我知道所有变量的名称,我可以手动执行此操作,但这很繁琐,对于

我有一个这样的数据集

data.frame(id = c(1,2,3,4), var1 = c(1,1,2,2), var2 = c(1,1,2,3)) 
我正试图做到这一点:

data.frame(id = c(1,2,3,4), var1 = c(1,1,2,2), var2 = c(1,1,2,3), same = c(NA, TRUE, FALSE, FALSE)) 
i、 e.仅当每个变量的差值等于0时,结果才为真。 如果我知道所有变量的名称,我可以手动执行此操作,但这很繁琐,对于我不知道名称、数量或变量的其他数据集,无法重复此操作。

您可以使用diff和rowSums来测试变量是否等于其以前的值

您可以使用diff和rowSums来测试变量是否等于它们以前的值

使用dplyr:

使用dplyr:


如果在我们的var1…之前有未知数量的列,它会是什么样子。。。。瓦恩?而且如果NA是有机地引入的,仅仅因为第一行的差异无法实现?另外,在dplyr管道内部使用mutate时,是否有解决方案?您可以通过将部分x[-1]更改为所需列的子集来选择要考虑的列,例如x[2:3]。如果在我们的var1之前有未知数量的列,它会是什么样子的。。。。瓦恩?而且如果NA是有机地引入的,仅仅因为第一行的差异无法实现?此外,在dplyr管道内部使用mutate时,是否有解决方案?您可以通过将部分x[-1]更改为所需列的子集来选择要考虑的列,例如x[2:3]。谢谢,这应该可以工作,只有当vars的名称与varx不同时,您才会做什么?如果列名中没有模式,那么您可以使用列号应用函数。Cross也接受列号。请帮助我理解代码中~的含义,否则我什么都懂。还有一件事,如果我想引入多个条件,比如diff为0,同时variable等于1?我原以为这只是一个简单的代码扩展和条件,但它不适用于我~是一个基于公式的语法,用于应用函数。它是匿名函数的一种替代方法,可与functionx==lagx一起使用。您也许可以将函数扩展为如下内容。x==lag.x==0&.x==1。这将给出diff=0和variable=1。如果您将其作为一个新问题来提问,而不是在注释中进行扩展,则会更好。谢谢,这应该会起作用,只有当vars的名称与var x不同时,您才会做什么?如果列名中没有模式,那么您可以使用列号应用函数。Cross也接受列号。请帮助我理解代码中~的含义,否则我什么都懂。还有一件事,如果我想引入多个条件,比如diff为0,同时variable等于1?我原以为这只是一个简单的代码扩展和条件,但它不适用于我~是一个基于公式的语法,用于应用函数。它是匿名函数的一种替代方法,可与functionx==lagx一起使用。您也许可以将函数扩展为如下内容。x==lag.x==0&.x==1。这将给出diff=0和variable=1。如果你把它作为一个新问题来问,而不是在注释中扩展它,那会更好。
x$same <- c(NA, rowSums(diff(as.matrix(x[-1]))) == 0)
x
#  id var1 var2  same
#1  1    1    1    NA
#2  2    1    1  TRUE
#3  3    2    2 FALSE
#4  4    2    3 FALSE
library(dplyr)

df <- data.frame(id = c(1,2,3,4), var1 = c(1,1,2,2), var2 = c(1,1,2,3)) 

df %>%
  mutate(across(starts_with('var'), ~.x == lag(.x), .names = '{col}_res')) %>%
  mutate(same = rowSums(!select(., ends_with('res'))) == 0) %>%
  select(-ends_with('res'))

#  id var1 var2  same
#1  1    1    1    NA
#2  2    1    1  TRUE
#3  3    2    2 FALSE
#4  4    2    3 FALSE