假设我们从下面的data个数据帧开始,由下面的代码生成:

> data
  ID Period_1 Period_2 Values State
1  1        1  2020-01      5    X0
2  1        2  2020-02     10    X1
3  1        3  2020-03     15    X0
4  2        1  2020-04      0    X0
5  2        2  2020-05      2    X2
6  2        3  2020-06      4    X0
7  3        1  2020-02      3    X2
8  3        2  2020-03      6    X1
9  3        3  2020-04      9    X0

data <- 
  data.frame(
    ID = c(1,1,1,2,2,2,3,3,3),
    Period_1 = c(1, 2, 3, 1, 2, 3, 1, 2, 3),
    Period_2 = c("2020-01","2020-02","2020-03","2020-04","2020-05","2020-06","2020-02","2020-03","2020-04"),
    Values = c(5, 10, 15, 0, 2, 4, 3, 6, 9),
    State = c("X0","X1","X0","X0","X2","X0", "X2","X1","X0")
  )

我正在努力学习如何使用R软件包数据.表,并希望使用它来计算从一个给定状态(下面代码示例中的状态"X0")到另一个状态的转换,当从一个周期移动或"转换"到下一个周期时(在这种情况下,周期测量是"周期_1").我在运行数据时得到以下结果.下表代码:

   OutflowState 2 4
1:           X0 0 0
2:           X1 1 0
3:           X2 1 0

Code run:

library(data.table)

dcast(
  setDT(data)[, OutflowState := factor(shift(State, type = c("lead"))), by = ID]
  [, period_factor := lapply(.SD, factor), .SDcols = "Period_1"]
  [, period_factor := as.numeric(period_factor) + 1],
    OutflowState ~ period_factor, length, 
    value.var = "Values", subset = .(State == "X0"), drop = FALSE
)

这个输出是正确的,但我想(a)在周期1和3的输出中添加列(周期1始终都是0,对于这个data数据帧,周期3应该显示所有0,因为在周期2中没有状态=X0;以及(b)从输出中删除周期_1=4的列,因为没有周期=4,这只是as.numeric(period_factor) + 1以上代码中用来标记下一个过渡期的一个技巧.我怎么能这么做?

当运行下面显示的代码段时,我会得到以下临时数据帧,所以一个解决方案是删除OutflowState=NA(消除所有概念周期4)的任何行,但我不知道如何做到这一点.

   ID Period_1 Period_2 Values State OutflowState period_factor
1:  1        1  2020-01      5    X0           X1             2
2:  1        2  2020-02     10    X1           X0             3
3:  1        3  2020-03     15    X0         <NA>             4
4:  2        1  2020-04      0    X0           X2             2
5:  2        2  2020-05      2    X2           X0             3
6:  2        3  2020-06      4    X0         <NA>             4
7:  3        1  2020-02      3    X2           X1             2
8:  3        2  2020-03      6    X1           X0             3
9:  3        3  2020-04      9    X0         <NA>             4

setDT(data)[, OutflowState := factor(shift(State, type = c("lead"))), by = ID][
  , period_factor := lapply(.SD, factor), .SDcols = "Period_1"][
  , period_factor := as.numeric(period_factor) + 1  
  ]
data

这个问题是How to use data.table to build a new dataframe showing inflows into a specified transition state based on the value of an element in a prior row?个解决过渡资金流入问题的结果.注意上面的数据.表代码允许将时间范围定义为周期_2,并对值的转换求和,而不是计算转换,并且需要维护这些功能.

下图更好地说明了:

enter image description here

推荐答案

我们可以将state_inflow()函数从my answer移到问题How to use data.table to build a new dataframe showing inflows into a specified transition state based on the value of an element in a prior row?,并将其转化为state_outflow()函数:

state_inflow <- function(mydat, target_state) {
  dcast(
    setDT(mydat)[, Previous_State := shift(State, fill = target_state), by = ID],
    factor(Previous_State) ~ factor(Period_1), length, value.var = "Values",
    subset = .(State == target_state), drop = FALSE
  )
} 

State分之interchanging the rolesdcast()分之Previous_State:

state_outflow <- function(mydat, target_state) {
  dcast(
    setDT(mydat)[, Previous_State := shift(State), by = ID],
    factor(State) ~ factor(Period_1), length, value.var = "Values",
    subset = .(Previous_State == target_state), drop = FALSE
  )
}

此外,没有向shift()函数提供填充值.因此,每个ID的第一周期的先前状态是NA.

调用该函数会得到预期的结果:

state_outflow(data, "X0")
   State 1 2 3
1:    X0 0 0 0
2:    X1 0 1 0
3:    X2 0 1 0

没有必要调整因子水平.

R相关问答推荐

如何在Chart_Series()中更改轴值的 colored颜色 ?

如何通过ggplot2添加短轴和删除长轴?

使用RSelenium在R中抓取Reddit时捕获多个标签

R -如何分配夜间GPS数据(即跨越午夜的数据)相同的开始日期?

如何创建累加到现有列累计和的新列?

我们如何在R中透视数据并在之后添加计算

优化从每个面的栅格中提取值

在不对R中的变量分组的情况下取两行的平均值

按组和连续id计算日期差

如何使用包metaviz更改标签的小数位数?

R中的Desolve:返回的导数数错误

使用R、拼图和可能的网格包绘制两个地块的公共垂直线

在shiny 表格中输入的文本在第一次后未更新

如何创建直方图与对齐的每月箱?

在一个multiplot中以非对称的方式在R中绘制多个图

使用点图调整离散轴比例

使用';IF';运算符判断数据框单元格中的给定值是否属于一组值

如何比较R中每行数据帧中的嵌套列表?

如何根据R中ggplot2中的离散y轴标签更改面板的背景 colored颜色 ?

在R中汇总分组的行