计算 R 中列值的变化

Count Change in Column Value in R

我有一个正在处理的数据集,其中有一个 ID 列表以及每个 ID 处于什么状态(下面的示例)

  d <- data.frame(
    ID = c(1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2),
 State = c(1,2,2,2,1,1,3,1,2,2,3,1,3,3,3,3,3,3,1,2,2,1,3,3,3,1)
  )

我正在寻找的是创建一个新的数据框,其中列出了每个 ID 的状态更改并对其进行了计数。例如,此代码的输出是...

ID 1->1 1->2 1->3 2->1 2->2 2->3 3->1 3->2 3->3
1   1    2     1   1    3    1    2    0    0
2   0    1     1   1    1    0    2    0    7

我读了很多例子,人们使用 sum(diff(sign(X)) != 0) 之类的代码来总结代码中的任何变化,但我希望它专门针对每个状态变化。

谢谢!

library(dplyr)

 d %>% 
   group_by(ID) %>%
   mutate(change = paste(lag(State), State, sep = "->")) %>%
   slice(-1) %>%
   with(table(ID, change))
#     change
# ID  1->1 1->2 1->3 2->1 2->2 2->3 3->1 3->3
#   1    1    2    1    1    3    1    2    0
#   2    0    1    1    1    1    0    2    7

如果您需要填写可能但未观察到的变化,您可以这样做:

all_states = unique(d$State)
all_changes = sort(outer(all_states, all_states, paste, sep = "->"))

d %>%
  group_by(ID) %>%
  mutate(change = factor(paste(lag(State), State, sep = "->"), levels = all_changes)) %>%
  slice(-1) %>%
  with(table(ID, change))
#    change
# ID  1->1 1->2 1->3 2->1 2->2 2->3 3->1 3->2 3->3
#   1    1    2    1    1    3    1    2    0    0
#   2    0    1    1    1    1    0    2    0    7