r - 根据条件为每个 ID 创建不同数量的行

我有一个数据框,每个 ID 一行。我正在尝试为每个 ID 创建多行,除了 startstop 之外的信息相同。

如果 age >= 36,这个 ID 总共应该有 9 行。 start 应该是 27, 28,..., 35。stop 应该是 28, 29,..., 36。

如果 27 > age age - 27)。例如,如果 age 是 30,那么这个 ID 应该总共有 3 行。

如果 age = 27,这个 ID 总共应该有 1 行。我的数据集中最小的年龄是 27 岁,因此每个 ID 应该至少有 1 行。

一些数据:

df$id <- c(1, 2, 3)
df$age <- c(27, 40, 30)
time.columns <- c("start", "stop")
df[, time.columns] <- NA

我希望它看起来像:

id age start stop 
1  27  27    28 
2  40  27    28
2  40  28    29
2  40  29    30 
2  ..  ..    ..
2  40  35    36
3  30  27    28 
3  30  28    29 
3  30  29    30 

最佳答案

您可以为“年龄”值编写一个基本的 if ... else 函数,并使用它来计算“开始”列。像这样的事情应该让你开始:

expander <- function(value) {
  if (value >= 36) {
    start = 27:35
  } else if (value == 27) {
    start = 27
  } else if (value > 27 & value < 36) {
    start = 27 + sequence(value - 27) - 1
  }
}

使用方法如下:

# Sample data
df <- data.frame(id = c(1, 2, 3, 4),
                 age = c(27, 40, 30, 29))

library(dplyr)
library(tidyr)

df %>% 
  group_by(id) %>% 
  mutate(start = list(expander(age))) %>% 
  unnest(cols = c(start)) %>% 
  mutate(stop = start + 1)
# # A tibble: 15 x 4
# # Groups:   id [4]
#       id   age start  stop
#    <dbl> <dbl> <dbl> <dbl>
#  1     1    27    27    28
#  2     2    40    27    28
#  3     2    40    28    29
#  4     2    40    29    30
#  5     2    40    30    31
#  6     2    40    31    32
#  7     2    40    32    33
#  8     2    40    33    34
#  9     2    40    34    35
# 10     2    40    35    36
# 11     3    30    27    28
# 12     3    30    28    29
# 13     3    30    29    30
# 14     4    29    27    28
# 15     4    29    28    29

如果你想一直使用 base R,你可以这样做:

x <- with(df, sapply(age, expander))

within(df[rep(1:nrow(df), lengths(x)), ], {
    start = unlist(x)
    stop = start + 1
})
##     id age stop start
## 1    1  27   28    27
## 2    2  40   28    27
## 2.1  2  40   29    28
## 2.2  2  40   30    29
## 2.3  2  40   31    30
## 2.4  2  40   32    31
## 2.5  2  40   33    32
## 2.6  2  40   34    33
## 2.7  2  40   35    34
## 2.8  2  40   36    35
## 3    3  30   28    27
## 3.1  3  30   29    28
## 3.2  3  30   30    29
## 4    4  29   28    27
## 4.1  4  29   29    28

https://stackoverflow.com/questions/65514641/

相关文章:

python - 模块未找到错误 : No module named 'psycopg2' in i

typescript - TypeScript 如何推断回调参数类型

swift - 如何在 SwiftUI 上启用核心数据加密?

node.js - 如何动态地从 Firestore 数组中删除多个元素?

java - JDBC 向数据库中插入变量

angular - 引用错误 : Can't find variable: globalThis

python - 如何从 Python 字典中的键中删除尾随空格?

powershell - 如何显示使用扩展参数调用的命令行

python - Pandas:如何用另一个值替换 int 子字符串

hash - 如何从 elixir 中的 map 创建 `hash` 或 `md5`?