计算 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
我有一个正在处理的数据集,其中有一个 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