r - 拆分单元格中的值并添加到 R 中新创建的行

标签 r if-statement conditional-statements

我有一个数据集,我需要在其中评估具有相同 ID 代码的多个条目,并在满足一组条件时拆分最后一行中的单元格值。

Condtionals = 该 id 的最后一行有 action=="l"& time >60。

如果满足此条件,我想更改行操作 <- "e",并且时间 <- 60。超过 60 的时间量应放在下面新形成的行中。新行的列内容应与父行相同,除了 action=="l"& time==original value - 60)。

样本数据集

id <- c("12_1","12_1","12_1","12_2","12_2","12_2")
action <- c("l","d","l","l","d","l")
time <- c(15,45,90,20,30,61)
dtfrm <-data.frame(cbind(id,action,time))

测试数据框

    id action time
1 12_1      l   15
2 12_1      d   45
3 12_1      l   90
4 12_2      l   20
5 12_2      d   30
6 12_2      l   61

我希望转换后的数据框看起来像这样

    id action time
1 12_1      l   15
2 12_1      d   45
3 12_1      e   60
4 12_1      l   30
5 12_2      l   20
6 12_2      d   30
7 12_2      e   60
8 12_2      l    1

最终我将有更复杂的条件来评估,但我正在尝试从简单开始,然后逐步处理将此数据集调整为工作顺序所需的更复杂的条件。谢谢。

最佳答案

我会写一个对一组“id”进行操作的函数:

process.one <- function(df) {
  n <- nrow(df)
  last.action <- df$action[n]
  last.time   <- df$time[n]
  if (last.action == "l" & last.time > 60) {
    next.row <- df[n, ]
    next.row$action = "l"
    next.row$time   = last.time - 60
    df <- rbind(df, next.row)
    df$action[n] <- "e"
    df$time[n]   <- 60
  }
  df
}

然后使用 plyr 分割/应用/合并:

ddply(dtfrm, "id", process.one)
#     id action time
# 1 12_1      l   15
# 2 12_1      d   45
# 3 12_1      e   60
# 4 12_1      l   30
# 5 12_2      l   20
# 6 12_2      d   30
# 7 12_2      e   60
# 8 12_2      l    1

还要确保您的 data.frame 没有因素,否则附加到它可能会出现问题。在顶部,它应该是:

dtfrm <- data.frame(id, action, time, stringsAsFactors = FALSE)

关于r - 拆分单元格中的值并添加到 R 中新创建的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15752461/

相关文章:

r - 在R中并行下载多个文件

c - 将函数放入带有和/或的条件中时,函数会被调用两次吗?

javascript - "else"无法使用 slideToggle 处理我的 Jquery 代码

c - 两个条件如何在 if-ifelse-else 语句中起作用?

java - 表达式条件的动态索引,例如 While、If 等

types - 在 swift 中检测对象是否恰好是特定类型而不是该类型的子类

r - 如何使用dplyr和整洁的评估以编程方式过滤数据帧?

r - 如何为因素的水平分配值(value)?

r - 从翻转对象中提取交叉点列表

javascript条件未到达else